我对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多名玩家,所以运行它需要几分钟时间。
我是不是错过了更好的方法?
之所以速度慢,是因为您正在为每个用户执行另一个查询。这就是所谓的N+1问题,因为这就是算法的复杂性。
通过更有效地从数据库中检索数据,很容易解决这个问题。您可以告诉Rails使用所谓的EagleLoading来加载所有必要的记录。
在这种情况下,它就像这样简单:
@players = Player.includes(:teams).all
Rails将执行一个查询来检索所有玩家,然后执行第二个查询来搜索所有团队,您将同样访问它们——您的视图根本不需要更改!