按多个属性和急切加载进行分组

时间:2013-11-06 16:32:53

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我在Rails 4.0.0上有一个简单的模型:

class Template < ActiveRecord::Base
    has_many :instances
end

class Instance < ActiveRecord::Base
    # attribute: completion_result
end

我想要抓取按countTemplate分组的completion_result个实例。我的查询如下:

    Instance.joins(:template)
            .where('templates.enabled = ?', true)
            .group(:template_id, :completion_result)
            .count

这很好用,我得到的结果如下:

{[7, "ok"]=>2, [10, "ok"]=>1, [8, nil]=>2,
 [8, "cancel"]=>2, [9, "ok"]=>1, [8, "ok"]=>5}

在我通过单个属性进行分组的其他查询中,我可以指定group(:template)而不是group(:template_id),这将使Hash的密钥成为{{1}相反,实例帮助我摆脱了n + 1查询场景。

在这种情况下,由于我按多个键进行分组,如果我将ActiveRecord更改为group Rails将生成无效查询(它将尝试选择group(:template, :completion_result)而不是template,它不存在。)

这是一个错误的Rails还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

你试过这样的事吗

Template.all.select('templates.*, COUNT(1) as count').select(:completion_result).joins(:instances).where(enable: true).group(:id).group(:completion_result).map{|x| {[x,x.completion_result] => x.count }}