Несколько sum () в ActiveRecord в Rails - PullRequest
10 голосов
/ 14 апреля 2011

Я бы хотел связать несколько сумм () с одной группой, одновременно выбирая другие поля. Я бы также предпочел использовать для этого методы ActiveRecord, а не создавать строку sql вручную, поскольку позже я могу изменить поведение унаследованных классов ActiveRecord.

Например, я хотел бы представить утверждение (в качестве примера)

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

с чем-то вроде:

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

Причина в том, что я могу позже добавить дополнительные группировки и предложения where, которые будут иметь все суммы.

1 Ответ

19 голосов
/ 14 апреля 2011

Это работает для меня:

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 не ожидает аргументов, определенных таким образом. Я тоже пробовал sum(:cost => :total_cost, :quantity => :total_quantity), но безрезультатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...