渴望加载嵌套关联

时间:2015-09-25 06:04:05

标签: ruby-on-rails eager-loading

我有以下型号:

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文件中,我试图遍历所有会话,显示有关会话的一些信息,并显示有关该会话的每个玩家的嵌套数据。

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 %>

问题是,当从name调用中获取session_player.player.name值时,由于空{0}}值,我无法从播放器和session_player对象中提取数据。对session_player.placing的调用成功。

我认为这是一个延迟加载问题,因为我可以在调试代码时检索session_player.player.name的值,而不是在运行它时。我尝试通过在控制器中尝试各种包含组合来急切加载数据,但它没有什么区别:

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

2 个答案:

答案 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 %>

答案 1 :(得分:0)

代码是正确的,但我用它填充的数据不是。其中一个值稍后在数据列表中为null。在模板渲染期间访问数据之前,没有捕获到此内容。急切加载对发生异常时的数据没有影响。