2012-11-09 27 views
10

Ho un modello offre e un altro storico_offerte, una offerta ha_many historical_offerte.ActiveRecord: aggiunta della condizione alla clausola ON per include

Ora vorrei caricare con impazienza lo storico di un determinato giorno per un insieme di offerte, se esiste. Per questo, penso di aver bisogno di passare il giorno alla clausola ON, non alla clausola WHERE, in modo da ottenere tutte le offerte, anche quando non ci sono offerte storiche per il giorno dato.

Con Offer.where (several_complex_conditions) .includes (: historical_offers) .dove ("historical_offers.day =?", Date.today)

vorrei avere

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

Ma voglio per avere la condizione nella clausola ON, non nella clausola WHERE:

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

Credo che avrei potuto modificare la definizione has_many con una condizione lambda per un dat specifica e, ma come dovrei passare in una data allora?

In alternativa potrei scrivere il mysqlf unisce in questo modo:

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

Ma come posso agganciare questo in modo che eager loading è fatto?

+0

A [domanda relativa] (http://stackoverflow.com/questions/15691558/refining-the-inner-join-when-using-includes -in-activerecord/17737833 # 17737833) ha ricevuto più attenzione, ma nessuno ha dato esattamente quello che stai cercando. –

risposta

1

Dopo un paio d'ore headscratching e cercando tutti i modi per realizzare eager loading di un set vincolato di record associati mi sono imbattuto di @answer in this thread che funziona bene per me dbenhur - tuttavia la condizione non è una cosa che sto passando (è una data relativa a Date.today). Fondamentalmente sta creando un'associazione con le condizioni che volevo inserire nella clausola LEFT JOIN ON nella condizione 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] 

E poi nel mio controller:

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