我有一个模型优惠和另一个历史_提供,一个提供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 ...
但是我希望在ON子句中有条件,而不是在WHERE子句中:
SELECT * FROM offers
LEFT OUTER JOIN historical_offers
ON offers.id = historical_offers.offer_id AND day = '2012-11-09'
WHERE ...
我想我可以用特定日期的lambda条件改变has_many定义,但是我如何传递日期呢?
或者我可以像这样编写连接mysqlf:
Offer.where(several_complex_conditions)
.joins(["historical_offers ON offers.id = historical_offers.offer_id AND day = ?", Date.today])
但是我怎么能把它连接好以便加载呢?
答案 0 :(得分: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])