[英]Arel left outer join on second level table
A.joins(b: :c)
但我希望 (b: :c) 成为 b.left_outer_join(:c)
请问有什么想法吗?
您可以通过手动附加b
LEFT OUTER JOIN 与c
来做到这一点:
a = A.arel_table
b = B.arel_table
c = C.arel_table
a
.join(b)
.on(a[:id].eq(b[:a_id]))
.join(c, Arel::Nodes::OuterJoin)
.on(b[:id].eq(c[:b_id])).to_sql
这使
SELECT
FROM "a"
INNER JOIN "b" ON "a"."id" = "b"."a_id"
LEFT OUTER JOIN "c" ON "b"."id" = "c"."b_id"
或者...
b = B.arel_table
c = C.arel_table
join_on = b.create_on(b[:c_id].eq(c[:id]))
bc_join = b.create_join(c, join_on, Arel::Nodes::OuterJoin)
result = A.joins(b).joins(bc_join)
另一个使用高度ActiveRecord
方法的替代方法(我们实际使用的唯一Arel
是简单地返回连接)
A.joins(:b,B.left_joins(:c).arel.join_sources)
结果查询相同:
SELECT
"a".*
FROM
"a"
INNER JOIN "b" ON "a"."id" = "b"."a_id"
LEFT OUTER JOIN "c" ON "b"."id" = "c"."b_id"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.