[英]Rails Inner Join not working but the SQL looks right
因此,我有2个表由ID连接。 我在Rails控制台中,输入:
Programmer.all(:joins=>:assignment)
生成的sql是:
SELECT `programmers`.* FROM `programmers` INNER JOIN `assignments` ON `assignments`.`programmer_id` = `programmers`.`id`
生成的输出与Programmer.all相同。 为什么不包括作业数据?
我相信我在很大程度上对您的问题进行了分析。 如果您只想加入对程序员的所有可用分配,那么您正在寻找:
Programmer.all(:include => :assignment)
设计Rails的目的是:joins
用于执行诸如排序和获取某些记录之类的事情,但仍将查询结果保持为最小大小-意思是, :joins
实际上从未在结果中包含来自联接表的结果。
现在,这是我以前的答案,它假定您要执行一个INNER JOIN
来仅使程序员获得分配,但是您也想要该数据。 在这种情况下,您有两种选择:
#1-使用:select
Programmer.all(:select => '*', :joins => :assignment)
这样会将SQL更改为:
SELECT * FROM `programmers` INNER JOIN `assignments` ON `assignments`.`programmer_id` = `programmers`.`id`
好处:您可以获得所需的查询,并且所有数据至少都在某个地方。
下行风险: assignments
直接分配给Programmer
对象,而不是在正确的地方Programmer.assignment
。
#2-结合使用:joins
和:includes
Programmer.all(:joins => :assignment, :include => :assignment)
产生SQL:
SELECT `programmers`.* FROM `programmers` INNER JOIN `assignments` ON `assignments`.`id` = `programmers`.`assignment_id`
SELECT `assignments`.* FROM `assignments` WHERE (`assignments`.`id` IN (?) )
优势:现在,所有数据都放在正确的位置。 您可以引用programmer.assignment
而无需其他查询。
缺点:您正在许多实例中运行该额外的查询。 我相当确定,Rails会在需要时尝试对其进行优化,如果不需要的话,它不会给您带来太多开销。
只需您就可以做到
Programmer.includes(:assignment)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.