ActiveRecord - 嵌套包含

时间:2017-12-29 16:22:32

标签: ruby-on-rails ruby activerecord associations

我正在尝试在Rails 5中执行以下查询,以便在我访问每个events时触发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

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

1 个答案:

答案 0 :(得分: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查询计划程序将确定它认为获取该数据的最佳方式。每个表可能只有1个查询而没有where,但是当你链接includes().where()时,你可能会得到2个带有左外连接的查询。