0

我有一个记录表,其中包含名为 item_id 和键的列。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,
}

我可以用 Hash 对象计数在两行中做到这一点:

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

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

4

2 回答 2

6
Record.count(group: "item_id")

或者

Record.select("item_id, COUNT(*) as count_all").group("item_id")

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

Record.select("item_id, COUNT(DISTINCT key) as count_all").group("item_id")
于 2012-12-23T14:38:45.543 回答
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如果你不需要指定任何条件。

于 2012-12-23T14:48:31.243 回答