สำหรับ Rails4:
ดังนั้นสิ่งที่คุณต้องการคือการเข้าร่วมภายในดังนั้นคุณควรใช้การรวมคำกริยา:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
แต่สำหรับบันทึกถ้าคุณต้องการเงื่อนไข "ไม่เป็นโมฆะ" เพียงแค่ใช้คำกริยาไม่:
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 รับรู้ตารางในสตริงและรู้ว่าจะเข้าร่วมตารางความคิดเห็นในแบบสอบถามแทนที่จะโหลดความคิดเห็นในแบบสอบถามแยกต่างหาก อย่างไรก็ตามการทำเช่นนี้โดยไม่ได้เขียนตัวแยกวิเคราะห์ SQL แบบเต็มเป่ามีข้อบกพร่องโดยเนื้อแท้ เนื่องจากเราไม่ต้องการเขียนตัวแยกวิเคราะห์ SQL เราจึงลบฟังก์ชันการทำงานนี้ จากนี้ไปคุณต้องบอก Active Record อย่างชัดเจนเมื่อคุณอ้างถึงตารางจากสตริง:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
ประเมินtrue
ในรูบีและ Arel แปลtrue
ไป1
ในแบบสอบถาม SQL ดังนั้นข้อความค้นหาที่สร้างขึ้นจึงเป็นสิ่งที่คุณขอมา - นี่ไม่ใช่ข้อผิดพลาด ARel