如何将含INNER JOIN与LEFT JOIN的SQL转换为Rails ORM语法?
将含LEFT JOIN的SQL转换为Rails ORM语法
一、SQL示例参考
通用表名SQL
SELECT *
FROM table_a
INNER JOIN table_b ON table_a.id = table_b.table_a_id
INNER JOIN table_c ON table_b.id = table_c.table_b_id
LEFT JOIN table_d ON table_a.id = table_d.table_a_id
WHERE [查询条件]
业务表名SQL(Student/student_notes示例)
SELECT s.id, s.name, sn.note_content
FROM students s
INNER JOIN student_classes sc ON s.id = sc.student_id
INNER JOIN classes c ON sc.class_id = c.id
LEFT JOIN student_notes sn ON s.id = sn.student_id
WHERE c.grade = 10
二、添加LEFT JOIN的Rails ORM实现方式
方式1:使用left_joins(Rails 5+推荐)
若你已完成INNER JOIN部分的代码(比如业务表的关联调用),只需链式追加left_joins即可,前提是模型已定义对应关联:
# Student模型需提前定义:has_many :student_notes Student.joins(:student_classes, :classes) .left_joins(:student_notes) .where(classes: { grade: 10 }) .select('students.id, students.name, student_notes.note_content')
方式2:手动编写SQL片段(适配复杂关联逻辑)
如果关联规则无法通过模型关联直接表达,可直接在joins中嵌入LEFT JOIN的SQL语句:
Student.joins(:student_classes, :classes) .joins('LEFT JOIN student_notes ON student_notes.student_id = students.id') .where(classes: { grade: 10 }) .select('students.id, students.name, student_notes.note_content')
三、通用表名对应的ORM示例
假设TableA模型已定义has_many :table_b、has_many :table_c(通过table_b关联)、has_many :table_ds,代码如下:
TableA.joins(:table_b, :table_c) .left_joins(:table_ds) .where([查询条件])
内容的提问来源于stack exchange,提问作者Gonza
相关产品推荐
相关产品推荐

