如何在Rails中排序之前按公共属性对值进行求和

时间:2016-04-20 07:22:41

标签: mysql ruby-on-rails activerecord

我需要按照模型的Points列中的值对Rails 4中的表中的记录进行排序。

这部分很简单,但我还有一个额外的复杂性:我希望在此类之前使用。sum来匹配user_id的所有值。换句话说,我希望.order属于用户的总分,其中可能包含多个值。

首先,为了生成一般订单,我尝试了:

@orders = Point.order(points: :desc)
@total = @orders.sum(:points)

这会在此表中生成一般值。但是,我想在执行@orders之前使用.sum添加匹配user_id的值。

为了更清楚,这是 Points.rb 表的样子。

Points.rb表格示例

|user_id: 1| points: 10 | game_id 3|
|user_id: 1| points: 20 | game_id 2|
|user_id: 2| points: 50 | game_id 3|
|user_id: 3| points: -10 | game_id 1|

这是否可以使用mysql进行分组,求和,然后排序而无需在原始表中创建新的聚合值?

2 个答案:

答案 0 :(得分:1)

您可以尝试下一个查询:

Point.order(points: :desc).group(:user_id).sum(:points)
#=> {2 => 50, 1 => 30, 3 => -10}

此代码生成SQL下一个查询:

  

SELECT SUM(pointspoints)AS sum_points,user_id AS user_id FROM   points GROUP BY pointsuser_id ORDER BY pointspoints DESC

答案 1 :(得分:-2)

我假设用户有很多分数&您的积分表包含一个名为" point"的列,因此您的控制器代码应类似于以下内容:

@user = User.all
@user.each do |u|
   puts u.points.sum(:point)
end