我有一个记录表,其中包含名为item_id和key的列。 Item_id是指向名为Item的表的外键。活动模型定义如下所示:
class Record < ActiveRecord::Base
belongs_to :item
end
class Item < ActiveRecord::Base
has_many :records
end
现在我想要计算每个项目有多少条记录属于不同的键,结果应该是
{
#<Item id: 1, ...> => 19,
#<Item id: 2, ...> => 6,
#<Item id: 3, ...> => 21,
#<Item id: 4, ...> => 33,
}
我可以使用哈希对象计数在两行中执行此操作:
records = Record.select('DISTINCT item_id, key').includes(:item)
records.each_with_object(Hash.new 0) { |e, a| a[e.item] += 1 }
我想知道是否可以使用纯活动记录查询或SQL语句来创建它。
答案 0 :(得分:6)
Record.count(group: "item_id")
OR
Record.select("item_id, COUNT(*) as count_all").group("item_id")
更新:在您的情况下,您可以计算具有不同键的记录,如下所示
Record.select("item_id, COUNT(DISTINCT key) as count_all").group("item_id")
答案 1 :(得分:0)
您可以使用ActiveRecord这样做(通过在每个项目记录上调用.record_count
来获取计数):
Item.
select("items.*, count(records.id) as record_count").
joins("left join records on records.item_id = items.id").
group("items.id").
all
如果您不需要指定任何条件,也可以使用4.1.2.4 :counter_cache。