我有以下型号:
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
答案 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。在模板渲染期间访问数据之前,没有捕获到此内容。急切加载对发生异常时的数据没有影响。