Untuk Rails4:
Jadi, yang Anda inginkan adalah gabungan dari dalam, jadi Anda harus menggunakan predikat gabungan:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Tetapi, sebagai catatan, jika Anda menginginkan kondisi "NOT NULL" cukup gunakan predikat tidak:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Perhatikan bahwa sintaks ini melaporkan penghentian (ini berbicara tentang snipet string SQL, tapi saya kira kondisi hash diubah menjadi string di parser?), Jadi pastikan untuk menambahkan referensi ke akhir:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
PERINGATAN DEPRECASI: Sepertinya Anda ingin memuat tabel (s) (salah satu dari: ....) yang direferensikan dalam snippet string SQL. Sebagai contoh:
Post.includes(:comments).where("comments.title = 'foo'")
Saat ini, Rekaman Aktif mengenali tabel dalam string, dan tahu untuk BERGABUNG dengan tabel komentar ke kueri, daripada memuat komentar dalam kueri yang terpisah. Namun, melakukan ini tanpa menulis parser SQL full-blown secara inheren cacat. Karena kami tidak ingin menulis parser SQL, kami menghapus fungsi ini. Mulai sekarang, Anda harus memberi tahu Rekaman Aktif secara eksplisit saat Anda mereferensikan tabel dari string:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
dievaluasitrue
dalam Ruby, dan ARel diterjemahkantrue
ke1
dalam query SQL. Jadi permintaan yang dihasilkan sebenarnya adalah apa yang Anda minta - ini bukan bug ARel.