1. ホーム
  2. ruby-on-rails

[解決済み] NOT NILを使ったRailsのWHEREコンディション

2022-03-24 20:36:41

質問

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のバグのように思えます。

解決方法は?

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

Rails 3

Rails 3で行う正規の方法です。

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