我正在使用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
答案 0 :(得分:8)
score
是Level
还是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
这就是你要找的东西。