我正在使用 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
最佳答案
你的score
是Level
还是User
?
好的,它们处于更深层次的嵌套关系中。
如果您的 User
模型声明:
class User < ActiveRecord::Base
has_many :games
has_many :levels, through: :games
end
然后你必须加入
关卡。
查看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()
到它。
您可以做的是在总和之前注入(inject) 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
也就是您要查找的内容。
关于ruby-on-rails - 来自 group(..).sum(..) 的 Rails 排序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505190/