2013-02-14 87 views
0

我有以下查詢:有沒有辦法在沒有數據要返回時忽略子查詢?

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」只會返回沒有記錄?

回答

1

嘗試:

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).nil? ? [0] : User.find_by_id(current_user_id).favorites.where("top_10 = true").map(&comic_id)}) 

user = User.find_by_id(current_user_id) 
Comic.join(:publishercomics).where("publisher_id = 1 AND (rating < 5 OR rating IS NULL) AND comics.id NOT IN (:favorites)", {:favorites => user.nil? ? [0] : user.favorites.where("top_10 = true").map(&comic_id)}) 
+0

這項工作如果使用[0]而不是[]。當你使用[]時,rails會生成「videos.id NOT IN(NULL)」,這不符合人們的期望。它永遠不會返回行。 我無法編輯您的文章,因爲添加0不符合要求。如果我的標準答案是正確的,即使答案不正確,通常的方式又如何? 我應該加我只嘗試過第一個例子,但第二個應該也可以。 – William 2013-02-14 17:37:02

+1

謝謝@William,根據您的建議更新了答案。 – shweta 2013-02-15 04:58:02

0

我發現另一種方式這個查詢可能會失敗。如果用戶存在,但沒有與用戶關聯的收藏夾。

起初我嘗試添加:

User.find_by_id(like_user_id).favorites.nil? ? [0] 

像這樣:

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).nil? ? [0] : User.find_by_id(like_user_id).favorites.nil? ? [0] : User.find_by_id(current_user_id).favorites.where("top_10 = true").map(&comic_id)}) 

但是,這並不工作,因爲 '收藏夾' 在某種程度上並非爲零。我不太明白這是如何工作的。所以,而是我用:

User.find_by_id(like_user_id).favorites.count == 0 ? [0] 

而這似乎工作。

相關問題