2016-08-06 2 views
0

У меня есть класс класса записи и периода оплаты, каждый из которых имеет start_time и end_time.Eager Load без формальной ассоциации ActiveRecord

Я захватывая диапазон записей с помощью

Record.where(start_time: s..e) 

Я бегу в вопрос запроса N + 1, потому что, когда я Переберите эти записи, я сделать запрос на это период оплаты. Период оплаты не может пересекаться, поэтому в записи может быть один или нет периода оплаты; но они не связаны с записью с любой кодированной ассоциацией активных записей. Мой запрос для поиска Pay Период:

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 с Records. Я просто боюсь, как это сделать.

+0

Что связь между paypriods и записей –

ответ

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)') 
Смежные вопросы