嘿,我是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>
提前致谢。
答案 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。
由于