Za prvé, first
a last
nejsou tak jednoduché, jak si myslíte, že jsou:úplně zanedbáváte limit
argument, který obě tyto metody podporují.
Za druhé, scope
je o něco víc než jen nóbl způsob přidávání metod třídy, které jsou určeny k vracení dotazů. Vaše rozsahy zneužívají scope
protože vracejí jednotlivé instance modelu spíše než dotazy. Nechcete použít scope
vůbec, právě se snažíte nahradit first
a last
třídy, tak proč je prostě nepřepíšete? Budete je však muset správně přepsat a to bude vyžadovat přečtení a pochopení zdroje Rails, abyste správně napodobili to, co find_nth_with_limit
dělá. Chcete přepsat second
, third
, ... a zbytek těch hloupých metod, když už jste u toho.
Pokud se necítíte dobře, nahraďte first
a last
(IMO dobrá věc), pak byste mohli přidat výchozí rozsah pro objednání věcí podle potřeby:
default_scope -> { order(:created_at) }
Samozřejmě, výchozí rozsahy přicházejí s vlastní sadou problémů a plížení věcí do ORDER BY vás pravděpodobně donutí zavolat reorder
kdykoli skutečně chcete zadat ORDER BY; nezapomeňte, že více volání k order
přidat nové objednávkové podmínky, nenahrazují ty, které již existují.
Případně, pokud používáte Rails6+, můžete použít Markusův implicit_order_column
řešení
abyste se vyhnuli všem problémům, které mohou způsobit výchozí rozsahy.
Myslím, že na to jdeš špatně. Kdykoli vidím M.first
Předpokládám, že se na něco zapomnělo. Objednávání věcí podle id
je v podstatě k ničemu, takže byste měli vždy ručně zadejte požadované pořadí, než použijete metody jako first
a last
.