ActiveRecord:如何找到所有孩子都符合条件的父母?

费利佩·扎万(Felipe Zavan)

假设我有一个Parent模型,其中有很多Child,并且Child也属于OtherParent

我怎么能找到它所有属于的所有Parent地方ChildOtherParent

在纯SQL中,我可以做

Parent.find_by_sql(<<SQL)
  SELECT *
  FROM parents p
  WHERE NOT EXISTS (
    SELECT *
    FROM children
    WHERE parent_id = p.id
      AND other_parent_id IS NULL
  )
SQL

(从此处开始),但我更愿意在可能的情况下利用ActiveRecord来实现。

谢谢!


我正在使用Rails 4.2.1和PostgreSQL 9.3

D面

使用arel可以使您走得更远。棘手的部分是如何不使用arel自己的查询语法编写整个查询

这是个窍门:使用进行查询时where,如果使用arel条件,则可以免费获得一些额外的方法。例如,您可以使用尾随具有的子查询.exists.not,这将使您将(NOT ( EXISTS (subquery)))Toss扔到父级的where-clause中,就可以设置好了。

问题是,您如何引用所涉及的表?为此,您需要Arel。可以使用Arel的where类似丑陋条件a.eq b但为什么?由于这是一个相等条件,因此您可以改用Rails的条件!您可以使用哈希键引用要查询的表,但对于另一个表(在外部查询中),可以使用其arel_table看这个:

parents = Parent.arel_table
Parent.where(
  Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)

您甚至可以通过稍微使用字符串并依靠可以将子查询作为Rails的参数的事实来减少Arel的使用where它没有太多用处,但是它并不会迫使您过多地研究Arel的方法,因此您可以使用该技巧或其他采用子查询的SQL运算符(甚至还有其他查询吗?):

parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
  Child.where(parent_id: parents[:id], other_parent_id: nil)
)

这里的两个要点是:

  • 您可以使用与构建常规查询相同的方式来构建子查询,并使用Arel引用外部查询的表。它甚至可能不是真正的表,可能是别名!疯狂的事情。
  • 您可以将子查询用作Railswhere方法的参数

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

所有孩子都符合条件的分组方式

来自分类Dev

为所有父母找到所有孩子

来自分类Dev

如何检查Java集合的所有元素是否都符合某个条件?

来自分类Dev

如何检查所有行是否都符合PHP中的条件

来自分类Dev

让所有父母为孩子

来自分类Dev

针对父母的所有孩子

来自分类Dev

SPARQL:查找所有子对象都符合条件的对象

来自分类Dev

查找所有子文档都符合条件的 MongoDB 文档

来自分类Dev

寻找所有孩子都具有相同价值的父母

来自分类Dev

当所有孩子都具有flex属性时,父母的辩护内容是否重要?

来自分类Dev

KDB + / Q:如何选择字典中所有值都符合条件的所有项(键和值)?

来自分类Dev

如何筛选有条件的孩子的父母

来自分类Dev

ActiveRecord-列出所有父母没有一个特定的孩子

来自分类Dev

如何获得所有符合条件的记录?

来自分类Dev

SignTool错误:未找到符合所有给定条件的证书

来自分类Dev

让所有父母共同拥有孩子

来自分类Dev

ReactJS-孩子如何找到其父母?

来自分类Dev

ReactJS-孩子如何找到其父母?

来自分类Dev

如何在每个孩子坐骑上而不是在所有孩子坐骑后更新父母的状态?

来自分类Dev

选择匹配的孩子父母的所有孩子表ID

来自分类Dev

如何在mysql中找到一个有孩子但又没有孩子的父母?

来自分类Dev

如何在Laravel中找到具有父母身份证的孩子?

来自分类Dev

仅当数组中的所有元素都符合MongoDb中的条件时才获取文档

来自分类Dev

postgresql:选择所有关联记录都符合条件的记录

来自分类Dev

如果数组中的所有元素都符合条件,则Mongo删除文档

来自分类Dev

仅当集合中的所有项目都符合特定条件时,才返回集合ID

来自分类Dev

在一对多MySQL关系中,如何确定父母的孩子的属性在所有父母中是否不唯一?

来自分类Dev

如何从父母的所有节点的JSON对象获取到孩子在Java?

来自分类Dev

如何按父母分组并收集gremlin中孩子的所有财产价值?

Related 相关文章

  1. 1

    所有孩子都符合条件的分组方式

  2. 2

    为所有父母找到所有孩子

  3. 3

    如何检查Java集合的所有元素是否都符合某个条件?

  4. 4

    如何检查所有行是否都符合PHP中的条件

  5. 5

    让所有父母为孩子

  6. 6

    针对父母的所有孩子

  7. 7

    SPARQL:查找所有子对象都符合条件的对象

  8. 8

    查找所有子文档都符合条件的 MongoDB 文档

  9. 9

    寻找所有孩子都具有相同价值的父母

  10. 10

    当所有孩子都具有flex属性时,父母的辩护内容是否重要?

  11. 11

    KDB + / Q:如何选择字典中所有值都符合条件的所有项(键和值)?

  12. 12

    如何筛选有条件的孩子的父母

  13. 13

    ActiveRecord-列出所有父母没有一个特定的孩子

  14. 14

    如何获得所有符合条件的记录?

  15. 15

    SignTool错误:未找到符合所有给定条件的证书

  16. 16

    让所有父母共同拥有孩子

  17. 17

    ReactJS-孩子如何找到其父母?

  18. 18

    ReactJS-孩子如何找到其父母?

  19. 19

    如何在每个孩子坐骑上而不是在所有孩子坐骑后更新父母的状态?

  20. 20

    选择匹配的孩子父母的所有孩子表ID

  21. 21

    如何在mysql中找到一个有孩子但又没有孩子的父母?

  22. 22

    如何在Laravel中找到具有父母身份证的孩子?

  23. 23

    仅当数组中的所有元素都符合MongoDb中的条件时才获取文档

  24. 24

    postgresql:选择所有关联记录都符合条件的记录

  25. 25

    如果数组中的所有元素都符合条件,则Mongo删除文档

  26. 26

    仅当集合中的所有项目都符合特定条件时,才返回集合ID

  27. 27

    在一对多MySQL关系中,如何确定父母的孩子的属性在所有父母中是否不唯一?

  28. 28

    如何从父母的所有节点的JSON对象获取到孩子在Java?

  29. 29

    如何按父母分组并收集gremlin中孩子的所有财产价值?

热门标签

归档