NOTNILを使用した状態のレール



Rails Where Condition Using Not Nil



解決:

Rails 3でこれを行うための標準的な方法:

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

ActiveRecord4.0以降はwhere.notなので、これを行うことができます:



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

テーブル間のスコープを操作するときは、活用することを好みます既存のスコープをより簡単に使用できるようにマージします。

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

また、includeは常に結合戦略を選択するとは限りません。使用する必要がありますここでも参照してください。そうしないと、SQLが無効になる可能性があります。



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

これはARelのバグではなく、ロジックのバグです。

ここで必要なのは次のとおりです。

Foo.includes(:bar).where(Bar.arel_table [:id] .not_eq(nil)) 

Rails4の場合:



したがって、必要なのは内部結合であるため、実際には結合述語を使用する必要があります。

Foo.joins(:bar)Foo内部結合バーから*を選択..。

ただし、レコードとして、「NOT NULL」条件が必要な場合は、単にnot述語を使用してください。

Foo.includes(:bar).where.not(bars:{id:nil})...のFoo左外側結合バーから*を選択します。WHEREbars.idはNULLではありません。

この構文は非推奨を報告していることに注意してください(文字列SQLスニペットについて説明していますが、パーサーでハッシュ条件が文字列に変更されていると思いますか?)。そのため、必ず最後に参照を追加してください。

Foo.includes(:bar).where.not(bars:{id:nil})。references(:bar) 

非推奨の警告:文字列SQLスニペットで参照されているテーブル(次のいずれか)を積極的に読み込んでいるようです。例えば:

Post.includes(:comments).where( 'comments.title =' foo '')

現在、Active Recordは文字列内のテーブルを認識し、コメントを別のクエリにロードするのではなく、コメントテーブルをクエリに結合することを認識しています。ただし、本格的なSQLパーサーを作成せずにこれを行うと、本質的に欠陥があります。 SQLパーサーを作成したくないため、この機能を削除します。今後、文字列からテーブルを参照する場合は、ActiveRecordに明示的に通知する必要があります。

Post.includes(:comments).where( 'comments.title =' foo '')。references(:comments)