我有一個模型(Feature
),可以有很多Assets
。這些Assets
每個都有一個issue_date
。無論Assets
是否有 - 最好帶有一個查詢,我都在努力處理看起來像是簡單的ActiveRecord查詢到查找所有Features
及其Assets
與明天的issue_date
。Rails 3:ActiveRecord query with:只包含返回在包含表中具有相關值的結果?
這是我的查詢現在。
Feature.includes(:assets).where(:assets => { :issue_date => Date.tomorrow })
不幸的是,這僅返回Assets
明天的issue_date
的Features
。更奇怪的是,生成的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
調用中指定的那些。我還需要對我的查詢做什麼?
如果issue_date是資產表中的字段,那麼您如何期待特定issue_date的查詢返回沒有任何資產的功能? – asc99c
如果我的帖子在這方面不明確,我表示歉意。如果**這樣的「資產」存在,我想要列出所有的「特徵」以及特定日期**的「資產」;否則,只是「功能」。 –
哦,對不起,我明白了,你確實解釋了它,但我認爲我迷路了,讀了導軌生成的查詢。 issue_date是針對外連接的查詢,而不是對結果集的查詢。 – asc99c