まず、 first
およびlast
思っているほど単純ではありません。limit
を完全に無視しています。 これらの方法の両方がサポートするという議論。
次に、scope
これは、クエリを返すことを目的としたクラスメソッドを追加するための凝った方法にすぎません。スコープがscope
を悪用しています クエリではなく単一のモデルインスタンスを返すためです。 scope
を使用したくない まったく、あなたはfirst
を置き換えようとしているだけです およびlast
クラスメソッドなので、単にオーバーライドしてみませんか?ただし、それらを適切にオーバーライドする必要があります。そのためには、Railsソースを読んで理解し、 find_nth_with_limit
します。 second
を上書きする必要があります 、third
、...そしてあなたがそれにいる間のそれらの愚かな方法の残り。
first
を置き換えるのが適切でないと思われる場合 およびlast
(良いことIMO)次に、デフォルトのスコープを追加して、必要に応じて注文することができます:
default_scope -> { order(:created_at) }
もちろん、デフォルトのスコープには独自の問題があり、このようにORDER BYに忍び込むと、おそらくreorder
実際にORDERBYを指定したいときはいつでも; order
への複数の呼び出しを覚えておいてください 新しい注文条件を追加します。すでに存在するものは置き換えられません。
または、Rails6 +を使用している場合は、Markusのimplicit_order_column
を使用できます。 ソリューション
デフォルトのスコープが引き起こす可能性のあるすべての問題を回避するため。
私はあなたがこれについてすべて間違っていると思います。 M.first
が表示されたときはいつでも 何か忘れられたと思います。 id
で並べ替える はほとんど役に立たないので、常にする必要があります first
などの方法を使用する前に、必要な順序を手動で指定します およびlast
。