選手名鑑のようなサイトを作成しており、戦績を出力する際にN+1問題が発生しています。
具体的な状況は以下の通りです。
テーブル
players
1- id 2- name
games
1- id 2- player1_id 3- player2_id 4- result
Controller
rb
1@player = Player.find(params[:player_id]) 2@games = Game.where(player1_id: @player.id).or(Game.where(player2_id: @player.id))
View
erb
1<h2>試合一覧</h2> 2<% @games.each do |game| %> 3 <div> 4 <%= Player.find(game.player1_id).name %><span>対</span><%= Player.find(game.player2_id).name %>//ここでN+1が発生 5 <%= game.result %> 6 </div> 7<% end %>
補足
- gamesテーブルのデータは、大会が開催されるごとに手動でCSVファイルを作成して、DBに直接インポートしています
- 各プレイヤーがgamesテーブルのplayer1に入るかplayer2に入るかに規則性はありません
この状況でN+1問題を解決し、クエリの数を減らす手段がございましたら、アドバイスいただけると嬉しいです。
どうぞよろしくお願いいたします。
追記
model
1class Player < ApplicationRecord 2 has_many :games 3end 4class Game < ApplicationRecord 5 belongs_to :player 6end
class Gameの関連定義を載せてください。
- id
- player1_id
- player2_id
- result
なのに game.player.name となっているので
コメントありがとうございます!
class Game < ApplicationRecord
belongs_to :player
end
となっています。
関連定義を載せてください。
- id
- player1_id
- player2_id
- result
とは? table定義ですか?
わかりづらくすみません。
teble定義です。
わからん、、、
gameにplayer_id が無いのに、 belongs_to :player が成り立ってるのか。
私の理解を超えてる
これたぶん、controllerのところの
```
@games = Game.where(player1_id: @player.id).or(Video.where(player2_id: @player.id))
```
が書き間違いで、gameかvideoかどっちかなんじゃないかな?混ぜてとったりはしないでしょ...
おっしゃる通り、書き違いです。申し訳ございません。
修正させていただきました。
ご指摘いただきありがとうございます。
回答2件
あなたの回答
tips
プレビュー