sql - Rails 5 - ActiveRecord - 过滤 has_many 关系包含但不排除空值

标签 sql ruby-on-rails postgresql activerecord eager-loading

让我解释一下标题。

我的模型 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 连接类型很有用:

enter image description here

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/

相关文章:

mysql - 为什么这会给我错误的 customerNumber?

ruby-on-rails - 测试函数包含 API 请求

postgresql - 如何将PostgreSQL Azure云服务器与SQL Developer连接?

ruby-on-rails - CarrierWave - PDF - 只选择第一页

mysql - 一次查询多项数据校验

postgresql - 如何将 Cayley 与 Postgres 后端一起使用?

用于从我的表中获取统计信息的 SQL 查询解决方案

sql - 如何从 tableA 中选择一行并加入同一个表中的下一个适当的行

c# - sql分组依据的使用方法

ruby-on-rails - 我们可以使用 Ruby on Rails 开发移动应用程序吗?