我正在尝试在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
实现我需要的正确方法是什么?
答案 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个带有左外连接的查询。