2011-04-13 14 views
10

Me gustaría vincular varias sumas() a un solo grupo al seleccionar otros campos al mismo tiempo. También preferiría usar los métodos ActiveRecord para hacer esto en lugar de construir una cadena sql manualmente, ya que puedo modificar el comportamiento de las clases heredadas de ActiveRecord más adelante.Múltiples suma (s) en ActiveRecord en Rails

Por ejemplo me gustaría representar a la declaración (como ejemplo)

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

con algo como:

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

La razón es que se me permite añadir grupos adicionales apartaderos y where- cláusulas posteriores, que todas las sumas tendrán en común.

Respuesta

19

Esto funciona para mí:

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 

me trataron sum(:cost, :quantity), pero no espera #sum argumentos definidos de esta manera. También probé sum(:cost => :total_cost, :quantity => :total_quantity), fue en vano.

Cuestiones relacionadas