Prima di tutto, first
e last
non sono così semplici come sembri pensare che siano:stai completamente trascurando il limit
argomento supportato da entrambi i metodi.
In secondo luogo, scope
è poco più di un modo elegante per aggiungere metodi di classe destinati a restituire query. I tuoi ambiti stanno abusando di scope
perché restituiscono istanze di modello singolo anziché query. Non vuoi usare scope
stai solo cercando di sostituire il first
e last
metodi di classe, quindi perché non li sovrascrivi? Dovresti tuttavia sovrascriverli correttamente e ciò richiederà la lettura e la comprensione della fonte di Rails in modo da imitare correttamente ciò che find_nth_with_limit
fa. Vorresti sostituire second
, third
, ... e il resto di quegli stupidi metodi già che ci sei.
Se non ti senti a posto, sostituisci first
e last
(una buona cosa IMO), quindi potresti aggiungere un ambito predefinito per ordinare le cose come desideri:
default_scope -> { order(:created_at) }
Naturalmente, gli ambiti predefiniti hanno una serie di problemi e intrufolarsi in ORDER BY in questo modo probabilmente ti costringerà a chiamare reorder
ogni volta che si desidera effettivamente specificare l'ORDINE PER; ricorda che più chiamate per order
aggiungi nuove condizioni di ordinazione, non ne sostituiscono una già presente.
In alternativa, se stai utilizzando Rails6+, puoi utilizzare implicit_order_column
di Markus soluzione
per evitare tutti i problemi che possono causare gli ambiti predefiniti.
Penso che stai sbagliando tutto questo. Ogni volta che vedo M.first
Presumo che qualcosa sia stato dimenticato. Ordinare cose tramite id
è praticamente inutile, quindi dovresti sempre specifica manualmente l'ordine che desideri prima di utilizzare metodi come first
e last
.