3

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

<%= 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
4

1 回答 1

10

你是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不返回 a Relation,而是 a 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

也就是说,您正在寻找什么。

于 2013-08-29T08:50:20.650 回答