让我解释一下标题。
我的模型 A 有_许多模型 B。
我想在显示所有模型 A 的同时按日期的月份和年份过滤模型 B
例如:
A1 -> 3 B
A2 -> 0 B
A3 -> 1B
这是我现在的查询:
A.includes(:b_relation)
.where("extract(month from b.date) = #{month}").references(:b_relation)
.where("extract(year from b.date) = #{year}").references(:b_relation)
.all
有效!但它只给我至少有一个 B 的 A。没有的 A 不显示。
如何使查询包含没有任何 B 的模型 A?
最佳答案
您现在正在执行的查询正在使用 INNER JOIN
,它将从 A
中排除没有关联 B
的记录。您想要的是 LEFT OUTER JOIN
— 又名 LEFT JOIN
。左连接包括父表中的所有行,无论关联表中是否有任何关联记录。
我总是发现这张图片对于可视化 SQL 连接类型很有用:
Rails 5 有一个 left_outer_joins
method为此(别名:left_joins
):
A.left_outer_joins(:b_relation)
在较早版本的 Rails 中,它更多的是手动(我只是在这里编造表名):
A.joins('LEFT OUTER JOIN "bs" ON "bs"."a_id" = "as"."id"')
关于sql - Rails 5 - ActiveRecord - 过滤 has_many 关系包含但不排除空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831822/