Rails4 の場合:
したがって、必要なのは内部結合であるため、実際には joins 述語を使用する必要があります。
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
ただし、記録のために、「NOT NULL」条件が必要な場合は、単純に not 述語を使用します。
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
この構文は非推奨であることに注意してください (文字列の SQL スニペットについて述べていますが、パーサーでハッシュ条件が文字列に変更されていると思いますか?)、参照を最後に追加してください。
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
非推奨警告: 文字列 SQL スニペットで参照されているテーブル (次のいずれか: ....) を積極的にロードしているようです。例えば:
Post.includes(:comments).where("comments.title = 'foo'")
現在、Active Record は文字列内のテーブルを認識し、別のクエリでコメントをロードするのではなく、コメント テーブルをクエリに JOIN することを認識しています。ただし、本格的な SQL パーサーを作成せずにこれを行うと、本質的に欠陥があります。SQL パーサーを書きたくないので、この機能を削除します。これからは、文字列からテーブルを参照するときは Active Record に明示的に伝える必要があります。
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)