我有三个模型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 =五个结果)?
答案 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 %>