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")