我对rails非常陌生,我试图找出最佳方法。
我有一个球员桌和球队桌。它们都是HABTM,并使用连接表。
模型
class Player < ActiveRecord::Base
has_and_belongs_to_many :teams
end
class Team < ActiveRecord::Base
has_and_belongs_to_many :players
end
控制器
def players
@players = Player.all
end
查看
<%@players.each do |player|%>
<tr>
<td><%= link_to "Add", "steam://friends/add/#{player.steamid}"%></td>
<td><%= link_to player.name, player%></td>
<td><%=player.email%></td>
<td><%=player.teams.teamname%></td>
</tr>
<%end%>
首先,我知道teamname应该是team_name。
我已经尝试构建一个循环遍历团队的循环,但是这个页面有超过1600个玩家,所以运行它需要几分钟。
我错过了更好的方法吗?
答案 0 :(得分:3)
这很慢的原因是因为您正在为每个用户执行另一个查询。这就是所谓的N + 1问题,因为这是算法的复杂性。
通过更有效地从数据库中检索数据来解决这个问题非常容易。你可以告诉Rails使用所谓的Eager Loading加载所有必要的记录。
在这种情况下,它就像这样简单:
@players = Player.includes(:teams).all
Rails将执行查询以检索所有玩家,然后执行第二个查询以检索所有团队,并且您将同样访问它们 - 您的视图根本不需要更改!