ruby - 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”的材料。
解决方案
从其他答案/评论中,我推断您不仅想找到链接到不称为“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 !)
推荐阅读
- java - 这个括号组合的时间复杂度是多少?
- wordpress - EC2重启后AWS word press网站缺少内容
- apache - Apache重写文件夹和文件夹内的文件不同
- python - 5GB xml 文件的模式验证
- python - 切片 RGB 适合图像时保持 WCS 坐标
- python - Python:将列表分配给函数
- google-apps-script - getCurrentCell() 没有返回任何内容
- typescript - 在加载实际模型之前使用 object3D
- python - Django自定义后端导致登录错误
- python - 为 jira lib 手动安装 python