仅查找已删除关联的记录

时间:2016-09-13 04:15:59

标签: ruby-on-rails postgresql join left-join

问题是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_bModelA.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

1 个答案:

答案 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')