通过has_many关系查询SQL / RoR ActiveRecord聚合

时间:2018-11-07 17:00:05

标签: mysql sql join activerecord

请考虑以下内容:

  1. 家庭有很多孩子(家庭1:许多孩子)
  2. 孩子的枚举属性age_group可以是婴儿,儿童,青少年或成人

我想创建几个范围:

  1. 选择所有只有age_group: baby个孩子的家庭。这意味着如果一个家庭有一个婴儿和一个孩子,那么这个家庭就不符合这个范围。

  2. 选择所有有婴儿和儿童,但没有少年或成人的家庭。

其他范围仅适用于age_group儿童,青少年,成人等,但我相信我可以根据与第一个范围相同的逻辑来创建该范围。

1 个答案:

答案 0 :(得分:0)

我最终想到了这样的东西...

Family.find_by_sql("SELECT * FROM kids WHERE NOT EXISTS ( SELECT NULL FROM kids WHERE kids.family_id = family.id AND family.age_group != 'baby')")

在我有限的测试数据中,这似乎使所有只有婴儿的家庭。我没有对此进行广泛的测试,因为它不可扩展。由于必须使用find_by_sql,因此无法将其与其他activerecord链接在一起,在其中调用或添加分页。

我决定走另一条路,在家庭中添加一个family_stage列,并且随时将孩子更新或添加到家庭中以更新family_stage。它使查询一切变得更加简单,并将处理置于更新方面。