2013-03-12 57 views
1

我有三种模式用户,游戏和点,其中用户获得积分玩游戏。我想要做的是在视图中显示用户最热门的游戏点数。识别导轨查询结果

我用这个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”的结果 - 这是针对给定游戏得分最高的用户 - 对于五场比赛(@mo​​st_popular_games =五次结果)中的每一场?

+0

也许尝试给模型关系看,所以它可以在不SQL来完成。关系是什么?一个用户一次玩一个游戏,或者两个用户可以玩一个游戏,或者一个用户只能玩一次游戏? – Zippie 2013-03-12 23:37:36

+0

我已经添加了模型。谢谢 – yellowreign 2013-03-12 23:48:29

+0

用户只能玩一次游戏吗? – Zippie 2013-03-12 23:52:30

回答

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 

(我根据您的示例假设GameRank上的total_points列)

在你看来:

<% @most_popular_games.each do |game| %> 
    <%= game.name %> 
    <% game.game_ranks.top.each do |rank| %> 
     <%= rank.user.name %>,<%= rank.total_points %> 
    <% end %> 
<% end %>