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
.