tables rails query multiple left joins inner includes active ruby-on-rails-3 activerecord join

ruby on rails 3 - rails - ActiveRecord: Agregar condición a la cláusula ON para incluye



rails sql query (1)

Después de unas pocas horas escarbando y probando todo tipo de formas de lograr una carga ansiosa de un conjunto restringido de registros asociados encontré la respuesta de @dbenhur en este hilo que funciona bien para mí, sin embargo la condición no es algo que esté pasando ( es una fecha relativa a Date.today). Básicamente está creando una asociación con las condiciones que quería poner en la cláusula LEFT JOIN ON en la condición 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]

Y luego en mi controlador:

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

Tengo ofertas modelo y otras ofertas históricas, una oferta tiene muchas entradas históricas.

Ahora me gustaría cargar ansiosamente las ofertas históricas de un día determinado para un conjunto de ofertas, si es que existe. Para esto, creo que necesito pasar el día a la cláusula ON, no a la cláusula WHERE, para poder obtener todas las ofertas, incluso cuando no haya ninguna ficha histórica para el día en cuestión.

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

Me gustaría obtener

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

Pero quiero tener la condición en la cláusula ON, no en la cláusula WHERE:

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

Supongo que podría alterar la definición de has_many con una condición lambda para una fecha específica, pero ¿cómo pasaría una fecha entonces?

Alternativamente, podría escribir las combinaciones mysqlf de esta manera:

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

Pero, ¿cómo puedo conectar esto para que se realice la carga ansiosa?