Rails: дополнительные запросы БД, возникающие в связи has_one

Я создаю приложение rails, в котором у меня есть модели: Team, Player, Team_Player и многие статистические модели, принадлежащие игроку. Модель Team_Player действует как промежуточное соединение команд и игроков.

Мой вопрос заключается в следующем: когда я называю что-то вроде

player = Player.find(team_player.player_id), 

rails выполняет множество вызовов баз данных не только к модели игрока, но и к статистическим моделям, связанным с игроком. Я понимаю, что поведение rails по умолчанию не загружать связанные модели, если я не указываю его. Таким образом, я предполагаю, что я указал это поведение где-то. Однако, я честно не уверен, где/как я это сделал. Я понимаю, что это странный вопрос, но, учитывая ниже, есть идеи, почему все дополнительные вызовы базы данных производятся?

Вот как я связал свои модели (с примером статистической модели):

class Team < ApplicationRecord
    has_many :team_players
end

class TeamPlayer < ApplicationRecord
    belongs_to :team
    belongs_to :player 
end


class Player < ApplicationRecord
    has_many :team_players
    has_one :passing_stats_season_total, dependent: :destroy

    delegate *PassingStatsSeasonTotal::ATTR_METHODS, to: :passing_stats_season_total

    after_initialize do
        self.build_passing_stats_season_total if passing_stats_season_total.nil?
    end 
end

class PassingStatsSeasonTotal < ApplicationRecord
    belongs_to :player

    ATTR_METHODS = [:attempts, :attempts=, etc.]
end

И теперь вид, где я на самом деле сделать вызов базы данных:

<tbody>
    <% @team.team_players.each do |team_player| %>
        <tr>
            <% player = Player.find(team_player.player_id) %>
            <td><%= player.name %></td>
            etc.
        </tr>
    <% end %>
</tbody>

Вот вывод консоли:

aPlayer = team.team_players.first
  TeamPlayer Load (0.3ms)  SELECT  "team_players".* FROM "team_players" WHERE "team_players"."team_id" = ? ORDER BY "team_players"."id" ASC LIMIT ?  [["team_id", 132], ["LIMIT", 1]]
 => #<TeamPlayer id: 1114, player_id: 8373, team_id: 132, created_at: "2016-12-30 00:11:42", updated_at: "2016-12-30 00:11:42"> 

player = Player.find(aPlayer.player_id)
  Player Load (0.1ms)  SELECT  "players".* FROM "players" WHERE "players"."id" = ? LIMIT ?  [["id", 8373], ["LIMIT", 1]]
  PassingStatsSeasonTotal Load (0.2ms)  SELECT  "passing_stats_season_totals".* FROM "passing_stats_season_totals" WHERE "passing_stats_season_totals"."player_id" = ? LIMIT ?  [["player_id", 8373], ["LIMIT", 1]]
 => #<Player id: # and a bunch of other stuff>

В этом примере как была загружена модель PassingStatsSeasonTotal?
Я понимаю, что это странный вопрос, но любая помощь была бы действительно оценена.

Спасибо!

2 ответа

  1. Мой собственный ответ: я удалил блок after_initialize и просто создал статистическую модель в другом месте, когда мне это было нужно. Я не совсем уверен, почему блок after_initialize изменил поведение по умолчанию, но это то, что произошло.

  2. Ваше условие в этой строке загружает PassingStatsSeasonTotalассоциацию:

    self.build_passing_stats_season_total if passing_stats_season_total.nil?
    

    Причина в том, что passing_stats_season_totalесть ссылка на ассоциацию. Прежде чем какие-либо методы могут быть вызваны на него, Rails должен загрузить его.