我在与报告相关的已知用户集合(即负责报告的用户和当前分配给它的用户)上对Bug报告列表进行分组。< / p>
模型Bug
(AR,Rails 4.2.x)因此具有两个关联assigned_to
和responsible
,它们被解析为外键assigned_to_id
,responsible_id
。
错误也可能与项目有关,项目也可能有一个负责任的用户集,因此它们也拥有responsible_id
外键。
由于我们正在对报告本身和相关项目中的两个属性进行分组,因此我们希望在返回的查询中包含关联的项目。
然后,我可以通过以下语句获取散列计数<User> => count
,并对错误报告的关联名称进行分组:
Bug.group(:assigned_to)
.includes(:project)
.references(:projects)
.count
正确产生了所需的结果:用户(受让人)的集合以及他们被分配到的错误。
对于负责人,同样的查询:
Bug.group(:responsible)
.includes(:project)
.references(:projects)
.count
会产生错误,因为responsible_id
和关联的bugs
查询中都包含属性projects
。
SELECT COUNT(DISTINCT "bugs"."id") AS count_id,
responsible_id AS responsible_id
FROM "bugs"
LEFT OUTER JOIN "projects" ON "projects"."id" = "bugs"."project_id"
GROUP BY "bugs"."responsible_id"
如果我使用Bugs.group('bugs.responsible_id')
对显式属性本身进行分组,我会得到一个有效的回复,但形式为responsible_id => count
。
SELECT COUNT(DISTINCT "bugs"."id") AS count_id,
bugs.responsible_id AS bugs_responsible_id
FROM "bugs"
LEFT OUTER JOIN "projects" ON "projects"."id" = "bugs"."project_id"
WHERE <condition>
GROUP BY bugs.responsible_id
有没有办法强制使用关联,但是如第二个查询那样命名查询?
当然,我可以处理结果并将其扩展到负责的用户,但是由于分组是更大查询功能的一部分,因此我只能在不对查询构建器进行大量更改的情况下操作分组标识符。
答案 0 :(得分:1)
我认为现在没有解决这个问题(在rails 4.2.4中)。这will however become easy in rails 5。
如果您现在绝对必须解决问题,可以使用rails 5中针对您的应用提供的修补程序修补ActiveRecord::Calculations#execute_grouped_calculation
。只需在config/initializers
添加初始化程序,例如active_record_calculations_patch.rb
具有以下(缩写)内容。您可以从rails版本中复制原始代码,然后添加修复程序:
module ActiveRecord
module Calculations
def execute_grouped_calculation(operation, column_name, distinct)
...
else
group_fields = group_attrs
end
# LINE OF CODE COPIED OVER FROM THE FIX
group_fields = arel_columns(group_fields)
# END OF COPIED OVER CODE
group_aliases = group_fields.map { |field|
column_alias_for(field)
...
end
end
end