繁体   English   中英

Rails的内部联接不起作用,但是SQL看起来正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM