PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

UUIDs classificáveis ​​e substituição de ActiveRecord::Base


Em primeiro lugar, first e last não são tão simples quanto você pensa que são:você está negligenciando completamente o limit argumento que ambos os métodos suportam.

Em segundo lugar, scope é pouco mais do que uma maneira elegante de adicionar métodos de classe que se destinam a retornar consultas. Seus escopos estão abusando de scope porque eles retornam instâncias de modelo único em vez de consultas. Você não quer usar scope em tudo, você está apenas tentando substituir o first e last métodos de classe, então por que você não os substitui? Você precisaria substituí-los corretamente e isso exigirá a leitura e compreensão da fonte Rails para que você imite adequadamente o que find_nth_with_limit faz. Você deseja substituir second , third , ... e o resto desses métodos bobos enquanto você está nisso.

Se você não se sentir bem em substituir first e last (uma coisa boa IMO), então você pode adicionar um escopo padrão para ordenar as coisas conforme desejado:
default_scope -> { order(:created_at) }

É claro que os escopos padrão vêm com seu próprio conjunto de problemas e inserir coisas no ORDER BY provavelmente o forçará a ligar para reorder sempre que você realmente quiser especificar o ORDER BY; lembre-se de que várias chamadas para order adicionar novas condições de pedido, elas não substituem uma que já existe.

Alternativamente, se você estiver usando Rails6+, você pode usar Markus implicit_order_column solução para evitar todos os problemas que os escopos padrão podem causar.

Acho que você está fazendo tudo errado. Sempre que vejo M.first Presumo que algo tenha sido esquecido. Ordenando coisas por id é praticamente inútil, então você deve sempre especifique manualmente a ordem desejada antes de usar métodos como first e last .