我将与报告相关的已知用户(即负责该报告的用户和当前分配给该用户的用户)的错误报告列表分组。
模型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的集合。
对于负责人,相同的查询:
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
有没有一种方法可以强制使用关联,但是可以像在第二个查询中那样对查询进行命名空间?
当然,我可以处理结果并将其扩展到负责的用户,但是,由于分组是更大查询功能的一部分,因此,我无需对查询生成器进行大量更改就只能操纵分组标识符。
我不认为现在有解决方案(在Rails 4.2.4中)。然而,这在导轨5中将变得容易。
如果您绝对必须立即解决问题,则可以ActiveRecord::Calculations#execute_grouped_calculation
使用Rails 5中适用于您的应用程序的修补程序进行修补。只需在添加一个初始化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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句