10

モデル オファーと別の history_offers があり、1 つのオファーには多くの history_offers があります。

ここで、一連のオファーがある場合、特定の日の history_offers を熱心にロードしたいと思います。このため、指定された日の history_offer がない場合でも、すべてのオファーを取得できるように、その日を WHERE 句ではなく ON 句に渡す必要があると思います。

Offer.where(several_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 ...

しかし、WHERE 句ではなく、ON 句に条件が必要です。

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])

しかし、熱心な読み込みが行われるようにするにはどうすればよいでしょうか?

4

1 に答える 1

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]

そして、私のコントローラーで:

@property = current_agent.properties.includes(:future_valid_prices).find_by_id(params[:id])
于 2013-09-01T16:49:06.427 に答える