没有正式ActiveRecord关联的Eager Load

时间:2016-08-06 03:23:34

标签: ruby-on-rails ruby activerecord eager-loading

我有一个Record类和Pay Period类,每个类都有一个start_time和end_time。

我使用

抓取一系列记录
Record.where(start_time: s..e)

我遇到了N + 1查询问题,因为当我遍历这些记录时,我会查询它的付费期。支付期间不能重叠,因此记录可以有一个或没有支付期;但它们与任何编码的活动记录协会都没有链接。我查询付款期的查询:

PayPeriod.where(%q{ (start_time, end_time) OVERLAPS (?, ?) }, self.start_time, self.end_time).first

课程:

class Record < ActiveRecord::Base
   ...
   validates :start_time, presence: true
   validates :end_time, presence: true
   ...
end    


class PayPeriod < ActiveRecord::Base
   ...
   validates :start_time, presence: true
   validates :end_time, presence: true
   ...
end

我知道我需要用记录预加载PayPeriods。我真的很挣扎着怎么做。

1 个答案:

答案 0 :(得分:0)

您始终可以使用纯SQL作为where方法的参数。请注意,表名通常是复数。

我想Record有很多PayPeriods,但它可能看起来像:

Record.where(start_time: (start_time..end_time))
      .joins(pay_periods)
      .where('(pay_periods.start_time, pay_periods.end_time) OVERLAPS (records.start_time, records.end_time)')