gpt4 book ai didi

ruby-on-rails - 首先使用 `joins()` 进行 INNER JOIN 然后是下一个表的 LEFT JOIN

转载 作者:行者123 更新时间:2023-12-03 20:17:19 60 4
gpt4 key购买 nike

我试图避免在 Rails 中对我的 joins 进行字符串插值,因为我注意到将查询器链接在一起时灵活性会降低。
也就是说,我觉得 joins(:table1)joins('inner join table1 on table1.id = this_table.table1_id') 灵活得多。

我想完成的是:

FROM table1
INNER JOIN table2 on table2.id = table1.table2_id
LEFT JOIN table3 on table3.id = table2.table3_id

内连接所有

但是,我不知道如何使用 Rails 的说法来做到这一点:
Table1.joins(table2: :table3)

结果在最终表上的 INNER 连接。
FROM table1
INNER JOIN table2 on table2.id = table1.table2_id
INNER JOIN table3 on table3.id = table2.table3_id

左加入所有

如果我使用 left_outer_joins ...
Table1.left_joins(table2: :table3)

结果在两个表上的 LEFT 连接(不需要)。
FROM table1
LEFT JOIN table2 on table2.id = table1.table2_id
LEFT JOIN table3 on table3.id = table2.table3_id

如何混合连接?

似乎无法在不指定关系的情况下链接连接......也就是说,这些不起作用:
Table1.joins(:table2).left_join(table2: :table3)
Table1.joins(:table2).left_join(:table3)

有没有办法按照我想要的方式做到这一点?

最佳答案

这里有 3 个选项,但第一个选项应该是最好的。

选项 #1:
您可以按如下方式重新排序您的 Joins ,我有相同的情况,我尝试了下面的方法并且它有效。你在这里做的是在开始时使用Table2,所以它可以是 join with Table1,也可以是 left_outer_join with Table3:

Table2.joins(:table1).left_outer_joins(:table3)

选项 #2:
您可以在 Rails 中使用 Raw Sql 如下:
Table1.joins(:table2).joins('LEFT OUTER JOIN table3  ON  table3.id = table2.table3_id')

选项 #3:
另一种获取 表3 数据的方法是使用 includes 如下,但它会触发3 个查询:
Table1.joins(:table2).includes(table2: :table3)

关于ruby-on-rails - 首先使用 `joins()` 进行 INNER JOIN 然后是下一个表的 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017576/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com