ruby-on-rails - 来自 group(..).sum(..) 的 Rails 排序结果

标签 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

最佳答案

你的scoreLevel还是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/

相关文章:

ruby - Ruby 的音频处理库?

ruby + Git : Integrating Changes On A Significantly Divergent Branch

ruby-on-rails - Ruby - 我们可以在类中的任何地方使用 include 语句吗?

ruby /导轨 : determine how deeply nested an object is

ruby-on-rails - 外键和 Mongoid

ruby - 如何检查 ruby 值是否为非负 float ?

ruby-on-rails - Nokogiri XML 和循环不起作用

javascript - 未捕获类型错误 : . vegas 不是函数

ruby-on-rails - 将 libsass 与 Rails Assets 管道一起使用

ruby-on-rails - Ruby on Rails 和多核 CPU