Đối với Rails4:
Vì vậy, những gì bạn muốn là một tham gia bên trong, vì vậy bạn thực sự chỉ nên sử dụng vị từ tham gia:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Nhưng, đối với bản ghi, nếu bạn muốn một điều kiện "KHÔNG NULL" chỉ cần sử dụng vị từ không:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Lưu ý rằng cú pháp này báo cáo sự phản đối (nó nói về đoạn mã SQL, nhưng tôi đoán điều kiện băm được thay đổi thành chuỗi trong trình phân tích cú pháp?), Vì vậy hãy chắc chắn để thêm các tham chiếu vào cuối:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
CẢNH BÁO KHAI THÁC: Có vẻ như bạn đang háo hức tải (các) bảng (một trong số: ....) được tham chiếu trong đoạn mã SQL. Ví dụ:
Post.includes(:comments).where("comments.title = 'foo'")
Hiện tại, Active Record nhận ra bảng trong chuỗi và biết THAM GIA bảng nhận xét vào truy vấn, thay vì tải nhận xét trong một truy vấn riêng. Tuy nhiên, làm điều này mà không cần viết một trình phân tích cú pháp SQL đầy đủ vốn là thiếu sót. Vì chúng tôi không muốn viết một trình phân tích cú pháp SQL, chúng tôi sẽ xóa chức năng này. Từ giờ trở đi, bạn phải thông báo rõ ràng cho Active Record khi bạn đang tham chiếu một bảng từ một chuỗi:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
ước tínhtrue
trong Ruby và ARel chuyểntrue
thành1
truy vấn SQL. Vì vậy, truy vấn được tạo trong thực tế là những gì bạn yêu cầu - đây không phải là lỗi ARel.