LoginSignup
5
6

More than 5 years have passed since last update.

where(nil) で scoped (rails4 なら all) が得られる

Posted at

条件を指定せずに、 ActiveRecord::Relation が欲しいとき

条件なし、つまりすべての ActiveRecord インスタンスを得るリレーションを得たい場合に Rails3 自体は scoped を使っていましたが Rails4 ではそのかわりに all を使うことになります。

Foo.scoped # for rails3
Foo.all    # for rails4

なお、 Rails4 では scoped がなくなったために、 Rails3 から Rails4 へバージョン更新する場合はひたすら scopedall に変えることになります。
しかし、 Rails3 の環境で scopedall に変えるとちょっと意味が変わってくる(返り値が ActiveRecord::Relation or Array)ので、移行途中のフェーズで全置換するのはちょっとマズイことになります。

Rails のバージョンで分岐させて両対応

(Rails::VERSION::MAJOR <= 3 ? Foo.scoped : Foo.all)

Rails のバージョンによって scoped を使うのか all を使うのかを切り替えています。
移行し終わったら、該当箇所を全て Foo.all に変えれば良いです。

もっと短く両対応

Foo.where(nil)

where に対して nil あるいは false を与えれば同じことになります。 where(nil) は Rails3 でも Rails4 でも先の意図通りの挙動をするので便利です。

なお

Foo.where("1 = 1")

と、常に真となる条件を与えても効果としては同じですが、
この場合はもちろん実際に DB に投げる SQL にも "1 = 1" がのっかってくることになります。

5
6
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
5
6