2015-09-25 2 views
0

У меня есть следующие модели:Нетерпеливой Загрузки Уплотненного Ассоциация

class Session < ActiveRecord::Base 
    belongs_to :game 

    has_many :session_players 
    has_many :players, through: :session_players 
end 

class SessionPlayer < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :session 
end 

class Player < ActiveRecord::Base 
    has_many :session_players 
    has_many :sessions, through: :session_player 
end 

В файле Еврорадио я пытаюсь перебрать все сеансы, отображающий некоторую информацию о сессии и отображение вложенных данных о каждом игроке на эту сессию.

Соответствующий код в файле ERB является:

<% @sessions.each do |session| %> 
     <tr> 
     <td><%= session.name %></td> 
     <td> 
      <table> 
      <% session.session_players.each do |session_player| %> 
       <!-- problem line below --> 
       <tr><td><%= session_player.player.name %> (<%= session_player.placing %>)</td></tr> 
      <% end %> 
      </table> 
     </td> 
     </tr> 
<% end %> 

Проблема заключается в том, что я не могу вытащить данные с обоих игрока и объекта session_player из-за нулевого исключения при получении значения name прочь session_player.player.name звонок. Вызов session_player.placing преуспевает.

Я считаю, что это была ленивая проблема с загрузкой, так как я могу получить значение session_player.player.name при отладке кода, просто не при его запуске. Я пытался нетерпеливый загрузки данных, пытаясь различными включает в себя комбинации в контроллере, но это не делает разницы:

@sessions = Session.includes(:session_players => :player).all

+1

Причина, по которой вы получаете пустое исключение при получении значения имени из 'session_player.player.name', связано с тем, что определенный' session_player' не имеет связанного с ним 'игрока'. Убедитесь, что все значения поля 'player_id' в таблице' session_players' ** не являются нулевыми ** и соответствуют таблице 'ids'' players' – Pavan

+0

В этом была проблема. Одно из последних значений было null. Я думал, что нетерпевая загрузка выявит проблему в контроллере, а не при разрешении данных в шаблоне, но это не так. –

ответ

0

Код был верным, но данных, которые я заполнял, не было. Одно из значений позже было нулевым в списке данных. Это не было обнаружено до тех пор, пока данные не будут доступны во время создания шаблона. Нежелательная загрузка не влияла на данные, когда произошло исключение.

0

Как об этом:

@sessions = Session.joins(:session_players) 

Или, чтобы избежать N + 1

@sessions = Session.includes(:session_players) 

Вы можете использовать try, чтобы определить, когда нет никакого отношения

<% session.session_players.each do |session_player| %> 
    <!-- problem line below --> 
    <tr><td><%= session_player.try(:player).try(:name) %> (<%= session_player.placing %>)</td></tr> 
<% end %> 
Смежные вопросы