我在Rails 4.0.0上有一个简单的模型:
class Template < ActiveRecord::Base
has_many :instances
end
class Instance < ActiveRecord::Base
# attribute: completion_result
end
我想要抓取按count
和Template
分组的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还是我错过了什么?
答案 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 }}