假设存在与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'的材料。
答案 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也是!)