Przede wszystkim first
i last
nie są tak proste, jak Ci się wydaje, że są:całkowicie lekceważysz limit
argument, który obsługuje obie te metody.
Po drugie, scope
to niewiele więcej niż wymyślny sposób dodawania metod klas, które mają zwracać zapytania. Twoje zakresy nadużywają scope
ponieważ zwracają instancje pojedynczego modelu, a nie zapytania. Nie chcesz używać scope
w ogóle, po prostu próbujesz zastąpić first
i last
metody klas, więc dlaczego ich po prostu nie zastąpisz? Musisz je jednak poprawnie zastąpić, a to będzie wymagało przeczytania i zrozumienia źródła Rails, aby prawidłowo naśladować to, co find_nth_with_limit
czy. Chciałbyś zastąpić second
, third
, ... i resztę tych głupich metod, kiedy już przy tym jesteś.
Jeśli nie czujesz się dobrze, zamień first
i last
(Dobra rzecz IMO), możesz dodać domyślny zakres, aby uporządkować rzeczy według potrzeb:
default_scope -> { order(:created_at) }
Oczywiście domyślne zakresy mają swój własny zestaw problemów, a wkradanie się do ORDER BY w ten sposób prawdopodobnie zmusi cię do wywołania reorder
za każdym razem, gdy faktycznie chcesz określić ORDER BY; pamiętaj, że wielokrotne wywołania order
dodaj nowe warunki zamówienia, nie zastępują one już istniejących.
Alternatywnie, jeśli używasz Rails6+, możesz użyć implicit_order_column
Markusa rozwiązanie
aby uniknąć wszystkich problemów, które mogą powodować domyślne zakresy.
Myślę, że robisz to źle. Za każdym razem, gdy widzę M.first
Zakładam, że o czymś zapomniano. Zamawianie rzeczy według id
jest prawie bezużyteczny, więc powinieneś zawsze ręcznie określ żądaną kolejność przed użyciem metod takich jak first
i last
.