ActiveRecord - 嵌套包含

问题描述 投票:1回答:1

我试图在Rails 5中执行以下查询,以便在我访问每个events.contact时不触发N + 1查询:

events = @company.recipients_events
                 .where(contacts: { user_id: user_id })

我尝试了.includes,.references和.eager_loading的一些组合,但它们都没有奏效。他们中的一些人返回了一个SQL错误,其他人在我访问events.contact时返回了一个nil对象。

这是我的关联的简短版本:

class Company
   has_many :recipients
   has_many :recipients_events, through: :recipients, source: :events
end

class Recipient
   belongs_to :contact
   has_many :events, as: :eventable
end

class Event
   belongs_to :eventable, polymorphic: true
end

class Contact
   has_many :recipients
end

什么是实现我需要的正确方法?

ruby-on-rails ruby activerecord associations
1个回答
1
投票

如果你在加载@company时已经知道user_id,我会做这样的事情:

@company = Company.where(whatever)
  .includes(recipients: [:recipients_events, :contact])
  .where(contacts: { user_id: user_id })
  .take
events = @company.recipients_events

或者,如果没有:

events = Company.where(whatever)
  .includes(recipients: [:recipients_events, :contact])
  .where(contacts: { user_id: user_id })
  .take
  .recipients_events

ActiveRecord查询计划程序将确定它认为获取该数据的最佳方式。它可能是每个表没有where的1个查询,但是当你链接includes().where()时,你可能会得到2个查询,它们都有左外连接。

© www.soinside.com 2019 - 2024. All rights reserved.