Rails where条件でNOT NILを使用する質問する

Rails where条件でNOT NILを使用する質問する

Rails 3 スタイルを使用すると、次の逆をどのように記述するのでしょうか。

Foo.includes(:bar).where(:bars=>{:id=>nil})

id が nil ではない場所を見つけたいです。試してみました:

Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql

しかし、次の結果が返されます:

=> "SELECT     \"foos\".* FROM       \"foos\"  WHERE  (\"bars\".\"id\" = 1)"

それは間違いなく私が必要としているものではなく、ARel のバグのように思えます。

ベストアンサー1

レール4+

ActiveRecord 4.0以降では、where.not次のようにすればいいのです:

Foo.includes(:bar).where.not('bars.id' => nil)
Foo.includes(:bar).where.not(bars: { id: nil })

テーブル間のスコープを扱うときは、merge既存のスコープをより簡単に使用できるようになります。

Foo.includes(:bar).merge(Bar.where.not(id: nil))

また、includes必ずしも結合戦略を選択するわけではないので、referencesここでも同様です。そうしないと、無効な SQL になる可能性があります。

Foo.includes(:bar)
   .references(:bar)
   .merge(Bar.where.not(id: nil))

レール3

Rails 3 でこれを行う標準的な方法は次のとおりです。

Foo.includes(:bar).where("bars.id IS NOT NULL")

おすすめ記事