预加载和 has_many 通过关联
Eager load and has_many through association
在我的模型中我有这个
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 创建一个table,其中包含与活动相关的用户及其参与状态。
在事件视图中我有这个
<% @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| %>
但它没有完成任务.....
您可以先将用户和事件包含在参与中,然后对它们进行迭代以获取每个参与记录的事件和用户,而不是获取所有用户并迭代它们以获取他们的参与和相关事件:
Participation.includes(:user, :event).where(event_id: @event.id).each do |participation|
puts participation.user.id
puts participation.status
puts participation.event.id
end
在您的event_controller中您可以像下面这样搜索
@event = Event.includes(participations: :user).find(params[:id])
我找到了解决方案。在事件视图中我这样做
<% @event.participations.includes(:user).each do |participation| %>
<% user = participation.user%>
在我的模型中我有这个
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 创建一个table,其中包含与活动相关的用户及其参与状态。
在事件视图中我有这个
<% @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| %>
但它没有完成任务.....
您可以先将用户和事件包含在参与中,然后对它们进行迭代以获取每个参与记录的事件和用户,而不是获取所有用户并迭代它们以获取他们的参与和相关事件:
Participation.includes(:user, :event).where(event_id: @event.id).each do |participation|
puts participation.user.id
puts participation.status
puts participation.event.id
end
在您的event_controller中您可以像下面这样搜索
@event = Event.includes(participations: :user).find(params[:id])
我找到了解决方案。在事件视图中我这样做
<% @event.participations.includes(:user).each do |participation| %>
<% user = participation.user%>