Allereerst, first
en last
zijn niet zo eenvoudig als je lijkt te denken:je negeert volledig de limit
argument dat beide methoden ondersteunen.
Ten tweede, scope
is niet veel meer dan een mooie manier om klassenmethoden toe te voegen die bedoeld zijn om query's te retourneren. Uw scopes misbruiken scope
omdat ze exemplaren van één model retourneren in plaats van query's. U wilt geen gebruik maken van scope
helemaal niet, je probeert gewoon de first
. te vervangen en last
class-methoden, dus waarom overschrijf je ze niet gewoon? Je zou ze echter correct moeten overschrijven en dat vereist het lezen en begrijpen van de Rails-bron, zodat je goed nabootst wat find_nth_with_limit
doet. U wilt second
. overschrijven , third
, ... en de rest van die dwaze methoden als je toch bezig bent.
Als u zich niet goed voelt over first
vervangen en last
(een goede zaak IMO), dan zou je een standaard bereik kunnen toevoegen om dingen naar wens te bestellen:
default_scope -> { order(:created_at) }
Natuurlijk hebben standaard scopes hun eigen problemen en als je dingen op deze manier in de ORDER BY sluipt, zul je waarschijnlijk gedwongen worden om reorder
op elk moment dat u de ORDER BY wilt specificeren; onthoud dat meerdere oproepen om order
voeg nieuwe bestelvoorwaarden toe, ze vervangen niet een die er al is.
Als u Rails6+ gebruikt, kunt u ook Markus's implicit_order_column
gebruiken oplossing
om alle problemen te vermijden die standaardbereiken kunnen veroorzaken.
Ik denk dat je dit helemaal verkeerd aanpakt. Elke keer dat ik M.first
. zie Ik neem aan dat er iets vergeten is. Dingen bestellen op id
is vrijwel nutteloos, dus u moet altijd geef handmatig de gewenste volgorde op voordat u methoden gebruikt zoals first
en last
.