Active Recordからデータを取得するときorder
は必ずつけたほうが良いという話を聞きました。
Article.last
はArticle.order(id: :asc).last
と解釈されるのだからorder(id: :asc)
をわざわざつけなくてもいいケースもあるかなと個人的に考えていたのですが、プロジェクトが育ってきた時に不具合になることがあるなと思いました。order
をつけないことで不具合が起こりえるケースを記事に残そうと思います。
ケース1(default_scopeにorderがある場合)
例えば、下記のようにdefault_scope
にorder
が設定されている場合、Article.last
の結果が変わってしまいます。
ちなみに、下記のような設定がない場合はArticle.last
はArticle.order(id: :asc).last
と同等の結果が返ります。
(この例以外でも順番が変更されてしまう事例があるかもしれません)
class Article < ApplicationRecord
default_scope { order(id: :desc) }
end
ケース2(has_manyにorderがある場合)
例えば、下記のようにhas_many
にorder
がある場合、Article.find(1).comments.last
の結果が変わってしまいます。
下記のような設定がない場合はArticle.find(1).comments.last
はArticle.find(1).comments.order(id: :asc).last
と同等の結果が返ります。
(この例以外でも順番が変更されてしまう事例があるかもしれません)
class Article < ApplicationRecord
has_many :comments, -> { order(id: :desc) }
end
最後に
Article.last
のようにシンプルに最後の要素を取得するだけだから、order
つけなくてもいいや〜って思っていると、何処かのタイミングで思わぬバグが発生する可能性があると思うので、今後、必ずorder
をつけていきたいと感じました。
他にもorder
をつけていないとこういう不具合が起こり得る事例がありましたら、教えていただけるとうれしいです。