Rails中MySQL关联查询包含无Condition的Patient的实现方法
解决方案
直接使用Rails的left_joins方法,通过嵌套关联完成左外连接,就能获取所有病床、关联患者及对应的诊断记录(无诊断记录的患者也会被完整保留):
HospitalBed.left_joins(patient: :conditions)
为什么这个方法可行?
left_joins(Rails 5+引入,旧版本可使用includes(...).references(...)替代)会生成左外连接,保留左侧所有hospital_bed和关联的patient记录,无论患者是否有对应的condition记录。- 嵌套的
patient: :conditions表示先关联病床到患者,再左关联患者到诊断记录,完全匹配你的需求逻辑。
额外优化:避免N+1查询
如果需要实际加载患者和诊断记录的完整数据(而非仅做关联查询),可以用includes预加载关联模型,避免后续的N+1性能问题:
HospitalBed.includes(patient: :conditions)
关于你之前遇到的冗余问题
你提到的joins('JOIN conditions')会生成笛卡尔积,自然产生大量冗余数据,而left_joins是基于外键的规范关联,不会出现这种情况。另外你写的Patient.left_joins(:conditions).merge(...)其实是多余的——left_joins本身就会返回所有患者,无论是否有诊断记录,不需要额外的merge条件。
内容的提问来源于stack exchange,提问作者marcHoll90
相关产品推荐
相关产品推荐

