You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:48:11