2011-04-13 2 views
10

다른 필드를 동시에 선택하면서 여러 개의 합계()를 단일 그룹에 연결하고 싶습니다. ActiveRecord 메서드를 사용하여 나중에 수동으로 sql 문자열을 구성하는 대신 ActiveRecord 상속 된 클래스의 동작을 수정할 수도 있습니다.레일즈의 ActiveRecord에서 여러 sum() s

LineItem.select(:user_id).group(:user_id).sum(:cost).sum(:quantity) 

이유 I 추가 그룹 총격 사건을 추가 할 수있는 및 어디에 - :

예를 들어 내가 좋아하는 뭔가 (예를 들어) 문을 대표하는

select user_id, sum(cost) as total_cost, sum(quantity) as total_quantity from line_items group by user_id 

싶습니다 나중에 모든 조항에 공통으로 적용됩니다.

require "active_record" 
require "logger" 

ActiveRecord::Base.logger = Logger.new(STDOUT) 
ActiveRecord::Base.establish_connection :adapter => "postgresql", :database => "francois" 

ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS values" 
ActiveRecord::Base.connection.execute "CREATE TABLE values(user_id INTEGER NOT NULL, quantity INTEGER NOT NULL DEFAULT 1, cost INTEGER NOT NULL DEFAULT 2)" 

class Value < ActiveRecord::Base 
end 

2.times do 
    5.times do |n| 
    Value.create!(:user_id => n) 
    end 
end 

Value.group(:user_id).select('user_id, SUM(cost) AS total_cost, SUM(quantity) AS total_quantity').each do |value| 
    p [value.user_id, value.total_quantity, value.total_cost] 
end 

내가 sum(:cost, :quantity) 시도했지만 #sum이 방법을 정의 인수를 기대하지 않습니다

답변

19

이 나를 위해 작동합니다. 나는 또한 아무 쓸모가 sum(:cost => :total_cost, :quantity => :total_quantity)을 시도했다.