sql >> Databáze >  >> RDS >> PostgreSQL

Tříditelná UUID a přepisující ActiveRecord::Base

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 .



  1. Optimalizace dotazů MySQL pomocí těžkých spojení

  2. PostgreSQL:Vytvořte index pro booleovský sloupec

  3. Dotazy MySQL

  4. Jak přidáte sloupec NOT NULL do velké tabulky na serveru SQL?