2013-07-28 1 views
2

나는 다음과 같은 모델이 있습니다액티브 쿼리하는 테이블에 걸쳐 SUM을 얻으려면

# == Schema Information 
# 
# Table name: quotes 
# 
# id      :integer   not null, primary key 
# bound_rate_id   :integer 
class Quote < ActiveRecord::Base 
    #snip 
end 

# == Schema Information 
# 
# Table name: rates 
# 
# id        :integer   not null, primary key 
# quoted_premium     :integer 
class Rate < ActiveRecord::Base 
    #snip 
end 

나는이 루프 같은 일을 계산합니다 쿼리 만들려면 :

sum = 0 
for quote in Quote.all 
    rate = Rate.find(quote.bound_rate_id) 
    sum += rate.quoted_premium 
end 

을 어떻게 것 ActiveRecord의 쿼리 인터페이스를 사용하여이 작업을 수행합니까? (I 레일 4를 사용하고 있습니다)


편집 : 나는 이미 Quote을 통해 이전 쿼리에서 ActiveRecord 인스턴스를, 그래서 quotes 테이블에서 내 쿼리의 시작을 선호하고 rates 테이블이 아닌 조인 것 다른 방법으로. 이처럼 :

some_quotes = Quote.where(:some_other_property, my_param); 
sum_of_rates = some_quotes.????? 

답변

3

sum = Rate.where(:id => Quote.pluck(:bound_rate_id).compact).sum(:quoted_premium) 

관계 where 절

sum = Quote.joins(:rate).where(:bound_rate_id => [list of Rate ids]).sum('rates.quoted_premium') 

경우 일부 특정 추가의 합계를 얻기 위해

sum = Quote.joins(:rate).sum('rates.quoted_premium') # it will get sum of all query's quoted_premium 

을이 밖으로 시도 추가 한 후이 밖으로 시도 당신은를 얻습니다. 10 오류, ActiveRecord가 결합을 어떻게 조합해야하는지 지정하십시오.

sum = Quote.joins('INNER JOIN rates ON quotes.bound_rate_id = rates.id').sum('rates.quoted_premium') 
+0

답변 해 주셔서 감사합니다! 불행하게도 (그리고 나는 내 질문에이 점을 명확히하지 않았다.) 나는 이미'quotes' 테이블에 대한 쿼리로부터'ActiveRecord' 인스턴스를 가지고 있기 때문에'quote' 테이블에서 쿼리를 시작하고' 요금 테이블. – Kevin

+0

@Kevin 두 모델 간의 관계. –

+0

모델을 살펴 봤습니다. 그것들은 프로그램 적으로 관계가있는'belongs_to','has_many' 또는'belongs_to_and_has_many' 관계를 명시 적으로 정의하지 않았습니다. 저는 우리가 "견적"마다 1 또는 0의 'Rate's가있는 관계를 "수동으로"설정하고 각'Rate '가 단일 견적에 속한다고 생각합니다. – Kevin

관련 문제