У меня есть модель (Feature
), которая может иметь много Assets
. Эти Assets
каждый имеет issue_date
. Я борюсь с тем, что кажется простым запросом ActiveRecord, чтобы найти все Features
и их Assets
с issue_date
завтрашнего дня, независимо от того, есть Assets
или нет - предпочтительно с один запрос.
Вот мой запрос прямо сейчас.
Feature.includes(:assets).where(:assets => { :issue_date => Date.tomorrow })
К сожалению, это возвращает только Features
, которые имеют Assets
с issue_date
завтрашнего дня. Еще более странно, что сгенерированный SQL выглядит так (завтра, очевидно, 19-е).
SELECT `features`.* FROM `features` WHERE `assets`.`issue_date` = '2011-08-19'
Разве это не должно иметь где-то там LEFT JOIN
? Это то, что я собираюсь сделать. Использование joins
вместо includes
дает INNER JOIN
, но это не то, что я хочу. Как ни странно, похоже, что у меня INNER JOIN
-тип поведения. Когда я запускаю этот запрос includes
, приведенный выше, выкладываемый SQL выглядит примерно так ...
SELECT `features`.`id` AS t0_r0, `features`.`property_id` AS t0_r1,
// every other column from features truncated for sanity
`assets`.`feature_id` AS t1_r1, `assets`.`asset_type` AS t1_r2,
// all other asset columns truncated for sanity
FROM `features`
LEFT OUTER JOIN `assets` ON `assets`.`feature_id` = `features`.`id`
WHERE `assets`.`issue_date` = '2011-08-19'
Который выглядит как будто он должен работать правильно, но это не так. Я получаю только Features
, которые имеют Assets
с issue_date
завтрашнего дня. Есть идеи, что я делаю не так?
Я попробовал более старый способ Rails v2…
Feature.find(:all,
:include => :assets,
:conditions => ['assets.issue_date = ?', Date.tomorrow])
Что дает мне такие же результаты. Есть один Feature
Я знаю, что не имеет Assets
на завтра, и его нет в этом списке.
Я также ковырялся и находил похожие вопросы, но я не мог найти тот, который объяснил бы противоположное поведение, которое я вижу.
Редактировать : Я , поэтому близко. Это дает мне все Feature
объекты.
Feature.joins("LEFT OUTER JOIN assets on assets.feature_id = feature.id AND asset.issue_date = #{Date.tomorrow}")
Это не , однако, получите мне соответствующий Assets
, связанный в объект. С feature
в качестве возвращаемого элемента в запросе feature.assets
делает еще один вызов в базу данных, что мне не нужно. Я хочу, чтобы feature.assets
возвращал только те, которые я указал в этом LEFT OUTER JOIN
вызове. Что еще мне нужно сделать с моим запросом?