Ruby on Rails嵌套循环

时间:2014-04-12 21:03:57

标签: ruby-on-rails-3 rails-activerecord erb

我对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个玩家,所以运行它需要几分钟。

我错过了更好的方法吗?

1 个答案:

答案 0 :(得分:3)

这很慢的原因是因为您正在为每个用户执行另一个查询。这就是所谓的N + 1问题,因为这是算法的复杂性。

通过更有效地从数据库中检索数据来解决这个问题非常容易。你可以告诉Rails使用所谓的Eager Loading加载所有必要的记录。

在这种情况下,它就像这样简单:

@players = Player.includes(:teams).all

Rails将执行查询以检索所有玩家,然后执行第二个查询以检索所有团队,并且您将同样访问它们 - 您的视图根本不需要更改!