我有这两个模型:
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为1
和2
的行。但是,我想从表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_a
id,records.first.model_b_value_a
等以查看model_b
的值
对于没有关联model_b
记录的记录,records.first.model_b_value_a
将返回nil