1

ユーザー、ゲーム、ポイントの3つのモデルがあり、ユーザーはゲームをプレイするためのポイントを獲得します。私がやろうとしているのは、最も人気のあるゲームのポイントが最も多いユーザーをビューに表示することです。

この質問を使用して、最も人気のあるゲームを特定しました。だから私は今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

私の質問は基本的に、5つのゲーム(@most_popular_games = 5つの結果)のそれぞれについて、「most_points_for_popular_game」(特定のゲームで最も多くのポイントを持つユーザー)の結果を再利用するにはどうすればよいですか?

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 に答える