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)