Подтвердить что ты не робот

ActiveRecord: добавление условия в предложение ON для включения

У меня есть предложения модели и еще одно history_offers, одно предложение has_many history_offers.

Теперь я хотел бы с нетерпением загрузить history_offers одного дня для набора предложений, если он существует. Для этого я думаю, что мне нужно передать этот день в предложение ON, а не в предложение WHERE, чтобы получить все предложения, а также когда в течение данного дня нет события history_offer.

С   Offer.where(несколько_complex_conditions).includes(: history_offers).where( "history_offers.day =?", Date.today)

Я бы получил

SELECT * FROM offers 
LEFT OUTER JOIN historical_offers 
ON offers.id = historical_offers.offer_id 
WHERE day = '2012-11-09' AND ...

Но я хочу иметь условие в предложении ON, а не в предложении WHERE:

SELECT * FROM offers 
LEFT OUTER JOIN historical_offers 
ON offers.id = historical_offers.offer_id AND day = '2012-11-09' 
WHERE ...

Я предполагаю, что я могу изменить определение has_many с условием лямбда на определенную дату, но как бы я прошел через дату?

В качестве альтернативы я мог бы написать объединения mysqlf следующим образом:

Offer.where(several_complex_conditions)
  .joins(["historical_offers ON offers.id = historical_offers.offer_id AND day = ?", Date.today])

Но как я могу подключить это так, чтобы выполнить загрузку?

4b9b3361

Ответ 1

После нескольких часов наброса и попыток разного рода усилий по загрузке ограниченного набора связанных записей я столкнулся с @dbenhur ответом в этом потоке, который работает отлично для меня - однако условие не то, что я передаю (это дата относительно даты.). В основном это создает связь с условиями, которые я хотел бы внести в предложение LEFT JOIN ON в условие has_many.

has_many :prices, order: "rate_date"
has_many :future_valid_prices,
    class_name: 'Price',
    conditions: ['rate_date > ? and rate is not null', Date.today-7.days]

И затем в моем контроллере:

@property = current_agent.properties.includes(:future_valid_prices).find_by_id(params[:id])