LoginSignup
0
1

More than 3 years have passed since last update.

なぜActive Recordからデータを取得するときに必ずorderをつける必要があるのか

Last updated at Posted at 2019-04-14

Active Recordからデータを取得するときorderは必ずつけたほうが良いという話を聞きました。
Article.lastArticle.order(id: :asc).lastと解釈されるのだからorder(id: :asc)をわざわざつけなくてもいいケースもあるかなと個人的に考えていたのですが、プロジェクトが育ってきた時に不具合になることがあるなと思いました。orderをつけないことで不具合が起こりえるケースを記事に残そうと思います。

ケース1(default_scopeにorderがある場合)

例えば、下記のようにdefault_scopeorderが設定されている場合、Article.lastの結果が変わってしまいます。

ちなみに、下記のような設定がない場合はArticle.lastArticle.order(id: :asc).lastと同等の結果が返ります。
(この例以外でも順番が変更されてしまう事例があるかもしれません)

class Article < ApplicationRecord
  default_scope { order(id: :desc) }
end

ケース2(has_manyにorderがある場合)

例えば、下記のようにhas_manyorderがある場合、Article.find(1).comments.lastの結果が変わってしまいます。

下記のような設定がない場合はArticle.find(1).comments.lastArticle.find(1).comments.order(id: :asc).lastと同等の結果が返ります。
(この例以外でも順番が変更されてしまう事例があるかもしれません)

class Article < ApplicationRecord
  has_many :comments, -> { order(id: :desc) }
end

最後に

Article.lastのようにシンプルに最後の要素を取得するだけだから、orderつけなくてもいいや〜って思っていると、何処かのタイミングで思わぬバグが発生する可能性があると思うので、今後、必ずorderをつけていきたいと感じました。

他にもorderをつけていないとこういう不具合が起こり得る事例がありましたら、教えていただけるとうれしいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1