1

我有三个模型用户,游戏和点,用户在玩游戏时获得积分。我正在尝试做的是在视图中显示最受欢迎的游戏得分最多的用户。

我用这个问题来确定最受欢迎的游戏。所以我现在在 Game.rb 中有这个范围:

scope :most_popular_games,
  select("games.id, name, count(points.id) AS points_count").
  joins(:points).
  group("games.id").
  order("points_count DESC").
  limit(5)

在我的控制器中,我有这个:

@most_popular_games = Game.most_popular_games

我的模型:

楷模

class Point < ActiveRecord::Base
  belongs_to :game
  belongs_to :user
end

class Game< ActiveRecord::Base
  has_many :points
end

class User < ActiveRecord::Base
  # no relationship for points or games
end

class GameRank < ActiveRecord::Base
  belongs_to :game
  belongs_to :user
end

但是,我不知道该怎么做是创建一种方法来计算每个用户对这些游戏中的每一个的积分并使其能够以不同的方式识别每个游戏,因此我在视图中将它们分割出来(即显示每场比赛的结果分别)。

我尝试在代码中添加它,但我不确定让每个游戏的结果在视图中可识别的最佳方法:

@most_popular_games.each do |most_popular_game|
  most_points_for_popular_game = GameRank.where("game_id =?", most_popular_game.id).order('total_points desc').limit(10)
end

我的问题基本上是我如何重用“most_points_for_popular_game”的结果 - 这是给定游戏中得分最高的用户 - 对于五场比赛中的每场比赛(@mo​​st_popular_games = 五个结果)?

4

1 回答 1

0

完全忽略 N+1 查询和附加标记:

:game_ranks关系添加到Game

class Game
  has_many :game_ranks
end

将范围添加到GameRank

class GameRank
  scope :top, order('total_points desc').limit(10)
end

(我假设一个基于你的例子的total_points专栏)GameRank

在您看来:

<% @most_popular_games.each do |game| %>
   <%= game.name %>
   <% game.game_ranks.top.each do |rank| %>
      <%= rank.user.name %>,<%= rank.total_points %>
   <% end %>
<% end %>
于 2013-03-13T04:24:05.297 回答