Først og fremmest first
og last
er ikke så simple, som du synes at tro, de er:du forsømmer fuldstændig limit
argument, som begge disse metoder understøtter.
For det andet scope
er lidt mere end en fancy måde at tilføje klassemetoder, der er beregnet til at returnere forespørgsler. Dine scopes misbruger scope
fordi de returnerer enkelte modelforekomster i stedet for forespørgsler. Du ønsker ikke at bruge scope
overhovedet, du prøver bare at erstatte den first
og last
klassemetoder, så hvorfor tilsidesætter du dem ikke bare? Du bliver dog nødt til at tilsidesætte dem korrekt, og det vil kræve at læse og forstå Rails-kilden, så du korrekt efterligner det find_nth_with_limit
gør. Du vil gerne tilsidesætte second
, third
, ... og resten af de dumme metoder, mens du er i gang.
Hvis du ikke føler dig rigtig med at erstatte first
og last
(en god ting IMO), så kan du tilføje et standardomfang for at bestille tingene som ønsket:
default_scope -> { order(:created_at) }
Selvfølgelig kommer standard scopes med deres egne problemer, og at snige ting ind i ORDER BY på denne måde vil sandsynligvis tvinge dig til at ringe til reorder
når som helst du rent faktisk ønsker at specificere ORDER BY; husk, at flere opkald til order
tilføje nye bestillingsbetingelser, de erstatter ikke en, der allerede er der.
Alternativt, hvis du bruger Rails6+, kan du bruge Markus' implicit_order_column
løsning
for at undgå alle de problemer, som standardomfang kan forårsage.
Jeg tror, du tager fejl af det her. Hver gang jeg ser M.first
Jeg går ud fra, at noget er blevet glemt. Bestilling af ting efter id
er stort set ubrugelig, så du bør altid manuelt angive den rækkefølge, du ønsker, før du bruger metoder som first
og last
.