ruby-on-rails – Rails中的ActiveRecord中有多个sum()

我想通过同时选择其他字段来将多个sums()链接到一个单独的组.我也更喜欢使用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-clause,这些都是共同的.

解决方法

这对我有用:
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),没有用.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...