2012-12-23 64 views
0

我有一個記錄表,列名爲item_id和key。 Item_id是指向名爲Item的表的外鍵。主動模型定義看起來如下:優化ActiveRecord計數查詢

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語句。

回答

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") 
+0

這似乎不是我想要的,因爲它包含了計數項目的重複鍵。 – ZelluX

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