Стремительная загрузка и has_many через ассоциацию - PullRequest
0 голосов
/ 21 марта 2019

В моих моделях у меня есть это

class User< ApplicationRecord
  has_many :participations
  has_many :events, :through => :participations
end

class Event < ApplicationRecord
  has_many :participations
  has_many :users, :through => :participations
end

class Participation < ApplicationRecord   
  belongs_to :user
  belongs_to :event    
end

Я хотел бы создать таблицу для события # show с пользователями, которые связаны с событием, и их статусом участия.

В окне просмотра событий у меня есть

<% @event.users.each do |user| %>
   <% p = Participation.find_by user_id: user.id, event_id: @event.id %>
........
.......

Однако это приводит к n + 1 запросам. Как я могу предварительно загрузить пользователей и участников для @event, чтобы устранить их?

Я пытался

   <% @event.users.includes(:participations).each do |user| %> 

но это не делает работу .....

Ответы [ 3 ]

1 голос
/ 21 марта 2019

в вашем event_controller вы можете искать вот так

@event = Event.includes(participations: :user).find(params[:id])
0 голосов
/ 21 марта 2019

Я нашел решение.В режиме просмотра событий я делаю это

 <% @event.participations.includes(:user).each do |participation| %>
    <% user = participation.user%>
0 голосов
/ 21 марта 2019

Вместо того, чтобы извлекать всех пользователей и итерировать их, чтобы получить их участие, а затем связанное с ними событие, вы могли бы сначала включить пользователя и событие в участия, а затем итерировать их, чтобы получить событие и пользователя каждой записи участия:

Participation.includes(:user, :event).where(event_id: @event.id).each do |participation|
  puts participation.user.id
  puts participation.status
  puts participation.event.id
end
...