我有以下查詢:有沒有辦法在沒有數據要返回時忽略子查詢?
Comic.join(:publishercomics).where("publisher_id = 1 AND (rating < 5 OR rating IS NULL) AND comics.id NOT IN (:favorites)", {:favorites => User.find_by_id(current_user_id).favorites.where("top_10 = true").map(&comic_id)})
current_user_id被設置爲0時,有在用戶沒有登錄,否則它被設定爲在當前登錄用戶的ID。我試圖這樣做是因爲我希望我不必編寫兩個查詢,一個用於用戶登錄,另一個不用。一般來說,編寫一個查詢可以跳過沒有找到記錄的事實,並停止嘗試連接不存在的數據,這似乎很有用。如果我直接寫SQL,這將是相當容易:
SELECT c.*
FROM comics c
INNER JOIN publishercomics pc ON pc.publisher_id = 1 AND pc.comic_id = c.id
WHERE comics.id NOT IN (SELECT comics_id FROM favorites WHERE user_id = current_user_id AND top_10 = true)
AND (c.rating < 5 OR c.rating IS NULL)
這個問題可以延伸到一般的情況下 - 有沒有一種方法,使鋼軌的查詢行爲有點更象SQL這樣當的一部分查詢返回沒有數據,整個查詢不會失敗?這樣「User.find_by_id(0).favorites」只會返回沒有記錄?
這項工作如果使用[0]而不是[]。當你使用[]時,rails會生成「videos.id NOT IN(NULL)」,這不符合人們的期望。它永遠不會返回行。 我無法編輯您的文章,因爲添加0不符合要求。如果我的標準答案是正確的,即使答案不正確,通常的方式又如何? 我應該加我只嘗試過第一個例子,但第二個應該也可以。 – William 2013-02-14 17:37:02
謝謝@William,根據您的建議更新了答案。 – shweta 2013-02-15 04:58:02