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

あなたはscoreにいますLevelUser
OK、それらはより深いネストされた関係にあります。

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

つまり、探しているものです。

于 2013-08-29T08:50:20.650 に答える