优化ActiveRecord计数查询

Zel*_*luX 0 sql activerecord ruby-on-rails

我有一个记录表,其中包含名为item_id和key的列.Item_id是指向名为Item的表的外键.活动模型定义如下所示:

class Record < ActiveRecord::Base
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :records
end
Run Code Online (Sandbox Code Playgroud)

现在我想计算每个项目有多少条记录属于不同的键,结果应该是这样的

{
    #<Item id: 1, ...> => 19,
    #<Item id: 2, ...> => 6,
    #<Item id: 3, ...> => 21,
    #<Item id: 4, ...> => 33,
}
Run Code Online (Sandbox Code Playgroud)

我可以用Hash对象计数在两行中执行此操作:

records = Record.select('DISTINCT item_id, key').includes(:item)
records.each_with_object(Hash.new 0) { |e, a| a[e.item] += 1 }
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以使用纯活动记录查询或SQL语句.

emr*_*man 6

Record.count(group: "item_id")
Run Code Online (Sandbox Code Playgroud)

要么

Record.select("item_id, COUNT(*) as count_all").group("item_id")
Run Code Online (Sandbox Code Playgroud)

更新:在您的情况下,您可以计算具有不同键的记录,如下所示

Record.select("item_id, COUNT(DISTINCT key) as count_all").group("item_id")
Run Code Online (Sandbox Code Playgroud)