2012-11-09 73 views
10

我有一個模型的優惠,另外historical_offers,一個報價的has_many historical_offers。ActiveRecord的:添加條件ON子句包括

現在我想急於負載一個給定的一天historical_offers一組的優惠,如果它存在。爲此,我認爲我需要將日期傳遞給ON子句,而不是WHERE子句,這樣我就可以獲得所有優惠,也可以在給定日期沒有historical_offer的情況下。

隨着 Offer.where(several_complex_conditions).includes(:historical_offers)。凡( 「historical_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定義特定DAT e,但是我怎麼會通過一個日期呢?

我也可以寫加入mysqlf這樣的:

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

但我怎麼可以連接這件事,以便預先加載完成?

+0

A [相關問題](http://stackoverflow.com/questions/15691558/refining-the-inner-join-when-using-includes -in-activerecord/17737833#17737833)獲得了更多的關注,但沒有給出你正在尋找的東西。 –

回答

1

經過幾個小時頭疼,並嘗試各種方式來完成一套有限的相關記錄的急切加載,我遇到@ dbenhur的answer in this thread,它適合我 - 但條件不是我傳遞(這是相對於Date.today的日期)。基本上它創建了一個關於我想把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])