通过关联分组时对列的不明确引用

时间:2015-11-26 13:27:54

标签: ruby-on-rails ruby

我在与报告相关的已知用户集合(即负责报告的用户和当前分配给它的用户)上对Bug报告列表进行分组。< / p>

模型Bug(AR,Rails 4.2.x)因此具有两个关联assigned_toresponsible,它们被解析为外键assigned_to_idresponsible_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

有没有办法强制使用关联,但是如第二个查询那样命名查询?

当然,我可以处理结果并将其扩展到负责的用户,但是由于分组是更大查询功能的一部分,因此我只能在不对查询构建器进行大量更改的情况下操作分组标识符。

1 个答案:

答案 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