繁体   English   中英

Arel 在二级表上左外连接

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

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