问题是RoR,但我想问题更多地适用于查询级别。
我有一个模特
ModelA has_many ModelB
我在其中都使用了paranoid
gem。
我正在尝试找出所有ModelA
关联的ModelB
或其ModelB
的所有deleted_at
都已删除(因此ModelA.joins('LEFT OUTER JOIN model_bs ON model_bs.model_a_id = model_as.id AND model_bs.deleted_at IS NULL')
.where('model_bs.model_a_id IS NULL')
.group(model_as.id)
不为空)。< / p>
基于this question,我能够达到预期的效果,但是阅读查询对我来说没有多大意义。
ModelA.joins('LEFT OUTER JOIN model_bs ON model_bs.model_a_id = model_as.id')
如上所述,阅读此查询对我来说没有意义,因为我使用的连接条件在之后的where子句中也是null。
有人可以帮助我正确设置查询,如果这是正确的方法,请解释我如何将查询分解为正确的结果。
更新
正如下面的评论中提到的,在一些原始的sql之后,我设法理解发生了什么。另外,写了我的AR解决方案,以使其更清晰(至少从我的角度来看)
分解:
此查询表示常规的左外连接,如果右侧有关联,则会独立返回左侧的所有模型。
AND model_bs.deleted_at IS NULL
在连接中添加额外条件
ModelB
将返回可用ModelA
属性的行,否则将返回仅包含.where('model_bs.model_a_id IS NULL')
的行。
在这些行上应用
model_a_id
将仅保留没有关联模型的行。
注意:
在这种情况下,使用属性model_b
或ModelA.joins('LEFT OUTER JOIN model_bs ON model_bs.model_a_id = model_as.id AND model_bs.deleted_at IS NULL')
.group('model_as.id')
.having('count(model_bs.id) = 0')
的任何其他属性都可以,但如果这样做,我建议使用一个属性,如果关联存在,它总是会在那里。否则你可能会得到错误的结果。
最后,通过使用翻译我想要的结果,我结束了AR:
ztable.glm
答案 0 :(得分:0)
嘿,您可以尝试这种方式我已在mysql
中对其进行了测试,您可以使用PG
验证它
ModelA.joins('LEFT OUTER JOIN model_bs ON model_bs.model_a_id = model_as.id')
.group('model_as.id')
.having('SUM(CASE WHEN model_bs.deleted_at IS NULL THEN 0 ELSE 1 END) AS OCT = 0')