Först och främst, first
och last
är inte så enkla som du verkar tro att de är:du försummar fullständigt limit
argument som båda dessa metoder stödjer.
För det andra, scope
är lite mer än ett fint sätt att lägga till klassmetoder som är avsedda att returnera frågor. Dina omfattningar missbrukar scope
eftersom de returnerar enstaka modellinstanser snarare än frågor. Du vill inte använda scope
överhuvudtaget försöker du bara ersätta den first
och last
klassmetoder så varför åsidosätter du dem inte bara? Du måste dock åsidosätta dem ordentligt och det kommer att kräva att du läser och förstår Rails-källan så att du korrekt efterliknar vad find_nth_with_limit
gör. Du vill åsidosätta second
, third
, ... och resten av de dumma metoderna medan du håller på.
Om du inte känner dig rätt om att byta ut first
och last
(bra IMO), då kan du lägga till ett standardomfång för att beställa saker som önskat:
default_scope -> { order(:created_at) }
Naturligtvis kommer standardomfång med sina egna problem och att smyga in saker i ORDER BY så här kommer förmodligen att tvinga dig att ringa reorder
när som helst du faktiskt vill ange ORDER BY; kom ihåg att flera samtal för att order
lägg till nya beställningsvillkor, de ersätter inte en som redan finns där.
Alternativt, om du använder Rails6+, kan du använda Markus's implicit_order_column
lösning
för att undvika alla problem som standardomfattningar kan orsaka.
Jag tror att du tänker fel på det här. Varje gång jag ser M.first
Jag antar att något har glömts bort. Beställa saker efter id
är ganska värdelös så du bör alltid ange manuellt den ordning du vill ha innan du använder metoder som first
och last
.