ActiveRecord根据不存在的子进程查找父级

时间:2018-05-29 10:16:40

标签: ruby activerecord

假设存在与AttributeType具有has_many关系的Material。我可以找到名字等于“abc”的孩子的父母。我想找到不包含名称等于“abc”的Child的Parent。我已经尝试过这样的事情:

attribute_types = @place.materials.collect(&:attribute_types).flatten.select{|at| at.name != "abc"}.flatten

但由于它只是没有拿起名为“abc”的孩子,它仍然会得到兄弟姐妹。所以当我使用时:

materials = @place.materials.where(id: attribute_types.map(&:material)).uniq

它仍然得到我不需要的记录。

我正在寻找的是当几种材料具有attribute_types'abc','def'和'ghi'时,我想寻找没有'abc'的材料。

1 个答案:

答案 0 :(得分:2)

从其他答案/评论中我推断,您不仅要查找链接到未被称为“abc”的属性的材料,还要排除具有属性abc链接的材料。

首先找到具有属性abc

的所有材料
materials_with_abc = @place.materials.joins(:attribute_types)
                                     .where(attribute_types: {name: 'abc'})

然后找到所有与abc无关的材料非常简单

@place.materials.where.not(id: materials_with_abs.select(:id))

(我先用地图写了,至少可以说是次优,但多亏了@enigineersmnky的提示,这会生成一个查询,并且在数据库中完全执行并且非常高效。无需手工 - 代码sql也是!)