2012-12-23 3 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, 
} 

내가 두 줄이 작업을 수행 할 수와 같은 결과가 보일 것 개별의 키를 사용하여 각 항목에 속하는 레코드 수를 계산하려면 다음과 같이 같은 활성 모델 정의 본다 기록 쿼리 또는 SQL 문 순수 활성을 사용하는 것이 가능하다 만약 내가 궁금

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

: 해시 객체 계산에.

답변

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

숫자의 항목에 중복 된 키가 포함되어 있기 때문에 원하는 내용이 아닌 것 같습니다. – ZelluX

0

당신은이 같은 액티브로 하나 그것을 할 수 아래처럼 개별의 키 레코드를 셀 수 (당신은 수를 얻을 각 상품 레코드에 .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을 사용할 수 있습니다.