ActiveRecord:为包含的ON子句添加条件

Jan*_*Jan 10 activerecord join ruby-on-rails-3

我有一个模型优惠和另一个历史_offers,一个提供has_many historical_offers.

现在,我想急切地将一天的历史记录加载到一组优惠中(如果存在的话).为此,我认为我需要将这一天传递给ON子句,而不是WHERE子句,这样我就可以得到所有的优惠,也就是当给定日期没有历史_天赋时.

使用Offer.where(few_complex_conditions).includes(:historical_offers).where("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 ...
Run Code Online (Sandbox Code Playgroud)

但是我希望在ON子句中有条件,而不是在WHERE子句中:

SELECT * FROM offers 
LEFT OUTER JOIN historical_offers 
ON offers.id = historical_offers.offer_id AND day = '2012-11-09' 
WHERE ...
Run Code Online (Sandbox Code Playgroud)

我想我可以用特定日期的lambda条件来改变has_many定义,但是我如何传递日期呢?

或者我可以像这样编写连接mysqlf:

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

但是我怎样才能将其连接起来以便进行急切加载?

edr*_*lph 1

经过几个小时的绞尽脑汁并尝试各种方法来完成对一组受约束的关联记录的热切加载后,我在这个线程中遇到了 @dbenhur 的答案,这对我来说效果很好 - 但条件不是我要传递的东西(它是相对于 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]
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中:

@property = current_agent.properties.includes(:future_valid_prices).find_by_id(params[:id])
Run Code Online (Sandbox Code Playgroud)