Für Rails4:
Was Sie also wollen, ist eine innere Verknüpfung, also sollten Sie wirklich nur das Prädikat joins verwenden:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Aber, für das Protokoll, wenn Sie eine "NOT NULL"-Bedingung wollen, verwenden Sie einfach das not-Prädikat:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Beachten Sie, dass diese Syntax eine Verwerfung meldet (sie spricht von einem String-SQL-Snippet, aber ich vermute, dass die Hash-Bedingung im Parser in String geändert wird), also achten Sie darauf, die Referenzen am Ende hinzuzufügen:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
DEPRECATION WARNING: Es sieht so aus, als würden Sie eifrig Tabelle(n) laden (eine von: ....), auf die in einem String-SQL-Snippet verwiesen wird. Zum Beispiel:
Post.includes(:comments).where("comments.title = 'foo'")
Zurzeit erkennt Active Record die Tabelle in der Stri die Kommentartabelle mit der Abfrage zu JOINen, anstatt die Kommentare in einer separaten Abfrage zu laden. Allerdings ist dies ohne das Schreiben eines vollwertigen SQL-Parser zu schreiben, ist von Natur aus mangelhaft. Da wir keinen SQL-Parser schreiben wollen Parser schreiben wollen, entfernen wir diese Funktionalität. Von nun an müssen Sie Active Record explizit mitteilen, wenn Sie eine Tabelle aus einer Zeichenfolge verweisen:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)