2017-02-17 4 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.

Thanks

0

Вы можете попробовать использовать следующее и удаление @sports = current_user.sports:

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

Спасибо! Как и ожидалось, это было очень просто –

Смежные вопросы