Ruby On Rails + PostgreSQL:如果没有找到匹配的数据,返回行为nil



我有这两个模型:

class ModelA < ApplicationRecord
has_one :model_b
has_one :model_b
end
class ModelB < ApplicationRecord
belongs_to :model_a
end

DB表中的数据:

model_a
id | ...
1  | ...
2  | ...
3  | ...
model_b
id | model_a_id | value_a | value_b
1  | 1          | abc     | def
2  | 2          | ghi     | jkl

对于model_a中的每条记录,我想从表model_b中获得一条记录-我可以像这样获得它。

ModelA.joins('LEFT JOIN model_b ON model_b.model_a_id = model_a.id')

这个查询将返回表model_a中ID为12的行。但是,我想从表model_a中返回ID为3的行,对于这一行,我想从model_b中返回具有这些值的相关(在这种情况下,不存在)行:

value_a: NULL
value_b: NULL

我该怎么做?我试着玩不同的JOINS,与CASE IF/ELSE/END,但我碰巧没有找到正确的组合。

因为我需要能够过滤/查询这些数据,我相信在PSQL级别上解决这个问题可能会更好,而不是在Rails上。

编辑:RIGHT JOIN只返回model_a的前两行。

EDIT2:这是期望的输出:

modal_a.id | modal_b.value_a | modal_b.value_b
1          | abc             | def
2          | ghi             | jkl
3          | null            | null

提前谢谢。

这叫做左外连接

ModelA.joins('LEFT OUTER JOIN model_b ON model_b.model_a_id = model_a.id')

它将返回所有ModelA记录,即使没有modelB记录存在。

In pure rails…

ModelA.includes(:model_b)

显式包含可能为nil的列…

records = ModelA.includes(:model_b).select('*, model_b.value_a as model_b_value_a, model_b.value_b as model_b_value_b')

这允许您执行records.first.id以查看model_aid,records.first.model_b_value_a等以查看model_b的值

对于没有关联model_b记录的记录,records.first.model_b_value_a将返回nil

最新更新