计算where子句活动记录中的关联

时间:2015-11-19 21:44:18

标签: ruby-on-rails postgresql activerecord

我有一份有很多孩子的父母名单,每个孩子只有一种技能。父母与孩子有多对多的关系,孩子可以拥有相同的技能。

我正在尝试获取所有父母的列表,并添加一个计数字段,显示他们拥有特定技能的孩子数量。活动记录可能吗?

我当前的解决方案使用此Parent.joins(:children).select('parents.*, COUNT(*) AS child_count').group('parents.id').where(children: {skill_name: skill})

但是,对于child_count,这并不会返回计数为0的父项。有没有办法用Active Record实现这一目标?我想为每个父母返回JSON,计算他们有多少孩子具有特定技能。

1 个答案:

答案 0 :(得分:0)

.joins(:children)生成一个INNER JOIN,它将排除有0个孩子的父母。您应该将其更改为OUTER JOIN。在大多数情况下,您无法使用ActiveRecord执行此操作(除非您也想执行预先加载)。假设您的连接表名为parents_children,那么您可以自己构建连接:

.joins("LEFT OUTER JOIN parents_children ON parents_children.parent_id = parents.id INNER JOIN children ON parents_children.child_id = children.id")