PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

UUID triables et remplacement d'ActiveRecord ::Base

Tout d'abord, first et last ne sont pas aussi simples que vous semblez le penser :vous négligez complètement la limit argument que ces deux méthodes prennent en charge.

Deuxièmement, scope n'est guère plus qu'un moyen sophistiqué d'ajouter des méthodes de classe destinées à renvoyer des requêtes. Vos champs d'application abusent de scope car ils renvoient des instances de modèle unique plutôt que des requêtes. Vous ne voulez pas utiliser scope du tout, vous essayez juste de remplacer le first et last méthodes de classe, alors pourquoi ne pas simplement les remplacer? Vous devrez cependant les remplacer correctement et cela nécessitera de lire et de comprendre la source Rails afin de bien imiter ce que find_nth_with_limit Est-ce que. Vous voudriez remplacer second , third , ... et le reste de ces méthodes idiotes pendant que vous y êtes.

Si vous n'êtes pas d'accord pour remplacer first et last (une bonne chose IMO), alors vous pouvez ajouter une portée par défaut pour ordonner les choses comme vous le souhaitez :

default_scope -> { order(:created_at) }

Bien sûr, les portées par défaut viennent avec leur propre ensemble de problèmes et se faufiler dans ORDER BY comme celui-ci vous forcera probablement à appeler reorder chaque fois que vous voulez réellement spécifier ORDER BY ; rappelez-vous que plusieurs appels à order ajoutez de nouvelles conditions de commande, elles ne remplacent pas celles qui existent déjà.

Sinon, si vous utilisez Rails6+, vous pouvez utiliser implicit_order_column de Markus solutions pour éviter tous les problèmes que les étendues par défaut peuvent causer.

Je pense que tu t'y prends mal. Chaque fois que je vois M.first Je suppose que quelque chose a été oublié. Trier les choses par id est à peu près inutile, vous devriez donc toujours spécifiez manuellement la commande souhaitée avant d'utiliser des méthodes telles que first et last .