显示拥有并属于索引中的许多关联

时间:2017-02-17 01:10:38

标签: ruby-on-rails activerecord

嘿,我是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>

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-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

由于