识别Rails查询结果

时间:2013-03-12 23:22:56

标签: ruby-on-rails ruby

我有三个模型User,Game和Point,用户可以获得玩游戏的积分。我想要做的是在视图中为最受欢迎的游戏显示最多积分的用户。

我使用此question来确定最受欢迎的游戏。所以我现在在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”的结果 - 对于给定游戏的点数最多的用户 - 对于五个游戏中的每一个(@most_popular_games =五个结果)?

1 个答案:

答案 0 :(得分: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 %>