2017-02-17 51 views
0

许多协会嘿,我是新来的Rails,所有这一切都与我相伴,谢谢!显示已经和属于索引

我有两个型号:

class User < ApplicationRecord 
has_and_belongs_to_many :sports 
end 

class Sport < ApplicationRecord 
has_and_belongs_to_many :users 
end 

我的用户有一些不同的体育项目,他们可以选择每个。我只是试图在一个表中显示所有用户,以及他们所做的运动。然而..我设法得到没有错误的东西的唯一方法是使用current_user,如下所示。我一直在寻找如何做几个小时......我知道这将是愚蠢的简单,但我无法弄清楚,甚至不知道如何去正确的方向。

# users_controller.rb 
def index 
@users = User.all 
@sports = current_user.sports 
end 

# users/index.html.erb 
<% @users.each do |user| %> 
    <tr> 
    <td><%= link_to user.name, user %></td> 
    <td><%= link_to user.email, user %></td> 
    <% @sports.each do |s| %> 
    <td><%= s.name %></td> 
    <% end %> 
    </tr> 
<% end %> 

这是我当前的代码,但显然这仅显示用户协会签署并重复它对于其他用户是这样的:

<table> 
<tr> 
<th>Name</th> 
<th>Sport 1:</th> 
<th>2:</th> 
</tr> 

<tr> 
<td>User 1 (current_user)</td> 
<td>Football</td> 
<td>Running</td> 
</tr> 

<tr> 
<td>User 2</td> 
<td>Football (User 1's Sports)</td> 
<td>Running </td> 
</tr> 
</table> 

在此先感谢。

回答

-1

使用user.sports同时通过每个用户的循环将导致N + 1个查询您的数据库。您可以将控制器的方法更改为类似

def index 
@users = User.all.eager_load(:sports) 
end 

,然后在HTML

<% user.sports.each do |s| %> 
<td><%= s.name %></td> 
<% end %> 

这将加载用户与体育台LEFT_OUTER_JOIN一起,这将节省大量的额外查询的数据库上。

对于信息你可以参考good blog

谢谢

0

您可以尝试使用以下并删除@sports = current_user.sports

<% user.sports.each do |s| %> 
<td><%= s.name %></td> 
<% end %> 
+0

谢谢!不出所料,它非常简单 –

相关问题