通过关联急切加载和has_many

问题描述 投票:0回答:3

在我的模特中我有这个

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| %> 

但它不能完成这项工作.....

ruby-on-rails has-many-through eager-loading
3个回答
0
投票

您可以首先在参与中包含用户和事件,然后迭代它们以获取每个参与记录的事件和用户,而不是获取所有用户并迭代它们以获得他们的参与然后他们的相关事件:

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

1
投票

在您的event_controller中,您可以在下面进行搜索

@event = Event.includes(participations: :user).find(params[:id])

0
投票

我找到了解决方案。在事件视图中我这样做

 <% @event.participations.includes(:user).each do |participation| %>
    <% user = participation.user%>
© www.soinside.com 2019 - 2024. All rights reserved.