0

私はこれらのモデルを持っています

class PlayersToTeam < ActiveRecord::Base
  belongs_to :player
  belongs_to :team

  accepts_nested_attributes_for :player
end

class Player < ActiveRecord::Base
  has_many :players_to_teams
  has_many :teams, through: :players_to_teams
end

class Team < ActiveRecord::Base
  has_many :players_to_teams
  has_many :players, through: :players_to_teams
  belongs_to :account
end

の表示ビューで、そのteamsのすべてを表示します。編集リンクは実際にはエントリを編集するためのものなので、次のようなものがありました。playersteamplayers_to_teams

  <% @team.players.each do |player| %>
  <tr>
    <td><%= player.FirstName %></td>
    <td><%= player.LastName %></td>
    <td><%= link_to "Edit", edit_players_to_team_path(player.players_to_teams.find_by_team_id(@team.id)) %></td>
  </tr>

@teamとして定義されましたTeam.find(params[:id])。これは非常に遅く、開発ログを見ると、ラインですべてのプレーヤーに対してデータベースが何度もヒットしていたためでしたedit_players_to_team_path(プレーヤーを見つけてから、要件に一致する player_to_team を見つけるために、おそらくもっと?)。

players_to teamだから私は代わりにレコードを使用するように切り替えました

<% @players_to_teams.each do |ptt| %>
  <tr>
    <td><%= ptt.player.FirstName %></td>
    <td><%= ptt.player.LastName %></td>
    <td><%= link_to "Edit", edit_players_to_team_path(ptt) %></td>
  </tr>
  <% end %>

コントローラーのどこ@players_to_teamsに等しいかteam.players_to_teams。これははるかに高速ですが、それでも私のビューのすべての行でデータベースにアクセスしているようです。

その に関連付けられている または レコードを返さないTeam.find(params[:id])と思います。これらの関連付けを含めて、 への呼び出しがと関連レコードの両方への参照を持つオブジェクトを返すようにする方法はありますか?playersplayers_to_teamsteamTeam.find(params[:id])playerplayer_to_teams

4

1 に答える 1

0

@player_to_teams レコードを取得するときは、そのクエリでプレーヤーを熱心に読み込みます.include(:player)(実際の構文は、使用しているクエリによって異なる場合があります)。そうすれば、アプリはデータベースを 1 回呼び出して ptt レコードを取得し、場合によってはすべてのプレーヤーを取得するためにもう 1 回呼び出します。これにより、ビュー内の各 ptt 反復でプレーヤーを検索する必要がなくなります。これを示すリンクがあります - http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

于 2012-04-05T17:13:00.690 に答える