【问题标题】:SQL / RoR ActiveRecord Aggregation Querying Through has_many RelationshipSQL/RoR ActiveRecord聚合查询通过has_many关系
【发布时间】:2018-11-07 17:00:04
【问题描述】:
考虑以下几点:
- 家庭有_many 个孩子(家庭 1:many Kid)
- Kid 有一个枚举属性 age_group,可以是婴儿、儿童、青少年或成人
我想创建几个范围:
选择所有有孩子的家庭只有age_group: baby。这意味着如果一个家庭有一个婴儿和一个孩子,那么这个家庭不应该符合这个范围。
选择所有有婴儿和孩子但没有青少年或成人的家庭。
其他范围是 age_group ONLY 儿童、青少年、成人等,但我相信我可以按照与第一个范围相同的逻辑来创建它。
【问题讨论】:
标签:
mysql
sql
join
activerecord
【解决方案1】:
我最终想出了这样的东西......
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,因此我无法将其与其他调用或添加分页的活动记录链接。
我决定采取另一条路线,并在家庭中创建一个family_stage 列,并且任何时候更新或添加孩子到家庭以更新family_stage。它使查询一切变得更加简单,并将处理放在更新方面。