首页 > 解决方案 > ActiveRecord 根据不存在的孩子找到父母

问题描述

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

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

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

我正在寻找的是当几种材料具有属性类型“abc”、“def”和“ghi”时,我想寻找没有“abc”的材料。

标签: rubyactiverecord

解决方案


从其他答案/评论中,我推断您不仅想找到链接到不称为“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))

(我首先用 map 编写了它,至少可以说是次优的,但是感谢@enigineersmnky 的提示,这会生成一个查询并完全在数据库中执行并且非常高效。也不需要手动编写 sql !)


推荐阅读