Rails排序结果来自组(..)。总和(..)

时间:2013-08-29 07:54:21

标签: ruby-on-rails ruby

我正在使用rails并绘制一些数据。我使用以下内容:

<%= column_chart User.includes(:levels).group(:email).sum(:score) %>

如何使这个组命令按照从最高到最低的分数对返回的数组进行排序?

我的模型安排如下

class User < ActiveRecord::Base
  has_many :games
  contains id, email
end

class Game < ActiveRecord::Base
  has_many :levels
  belongs_to :user
  #contains id, user_id, name

  accepts_nested_attributes_for :levels
end

class Level < ActiveRecord::Base
  belongs_to :game
  #contains id, score and game_id
end

1 个答案:

答案 0 :(得分:8)

scoreLevel还是User? 好吧,他们处于更深层次的嵌套关系中。

如果您的User模型声明:

,您可以让生活更轻松
class User < ActiveRecord::Base
  has_many :games
  has_many :levels, through: :games
end

然后你必须join级别。

查看ActiveRecord生成的SQL,您可以看到

User.joins(:levels).group(:email).sum(:score)

产生

SELECT sum(score) AS sum_score, email FROM users INNER JOIN games ON games.user_id = users.id INNER JOIN levels ON levels.games_id=games.id GROUP BY email

由于sum不会返回Relation,而是ActiveSupport::OrderedHash,因此您无法将.order()添加到其中。 你可以做的是在总和之前注入order

User.joins(:levels).group(:email).order('sum_score DESC').sum(:score)

产生

SELECT sum(score) AS sum_score, email FROM users 
   INNER JOIN games ON games.user_id = users.id 
   INNER JOIN levels ON levels.games_id=games.id 
  GROUP BY email 
  ORDER BY sum_score DESC

这就是你要找的东西。