2012-09-18 18 views
2

對於基本條件(如find語句)和更一般的where子句,用戶都有能力查找任何一組條件。例如:Rails條件,如何解決從陣列中刪除nils的問題?

User.find_by_name(["One", "Two", "Three"]) 
User.find_by_name_and_age(["One", "Two"],[1,2,3]) 

User.where(:bonus_id => [1,2,3]) 

他們是這裏的輕微inconsistance,雖然。如果你使用

User.find_by_bonus_id([nil,1,2]) 

這將返回使用與獎金ID爲「無」,正如所料!但是,「find_by _... ...」格式和「where」格式都不能以這種方式工作。

User.where(:bonus_id => [nil,1]) 

只會返回那些用戶提供的1

User.where(:bonus_id => [nil] 

一個bonus_id將返回全無!

User.where(:bonus_id => nil) 

但是,工作正常。

據我所知,where子句(和find_by_and方法)摺疊它們的數組,刪除任何非真值的值。這對我來說是一個非常重要的問題。

有沒有人知道一種方法來將nils包含在where子句數組(或解決方法)中,還是我將不得不最終加入多個查詢以獲得正確的行爲?

其他注意事項:
- 版本3.0.11
- 尼爾斯實際上並沒有被丟棄,而是在某些情況下它是在(NULL)比較,而不是在SQL NULL。我現在離開標題,因爲即使它不準確,遇到問題時也會出現問題。

+1

軌道版本?在3.2.0'find_all_by_xyz'和'where'的工作方式完全相同(如你所期望的,'nil'包含在內) – tokland

+0

3.0.11。這可能是因爲這不是預期的行爲,而且它已經被修復了。 – GlyphGryph

+0

什麼'User.where(:bonus_id => [nil,1])。to_sql'在3.0.11中說?我只有3.2便利,並且正確地將WHERE子句中的'nil'分割成單獨的或x爲空的塊。 –

回答

2

我無法在Rails 3.1.0上重現您的問題。你使用什麼版本?

試試這個:

User.where(["bonus_id IN (?) OR bonus_id IS NULL", [1,2]]) 

將返回用戶在bonus_id是1,2,或空

+0

我不知道我會認爲這是一種解決方法。我只是認爲它是答案。理解一個重要的事情是* NULL不是值*,因此,*什麼都不等於NULL *,甚至不是NULL,所以檢查是否有等於NULL(我相信'nil'會映射到)doesn'沒有道理,因爲它永遠不會是真的。 –

+0

賈森,除了當然,檢查無值的工作,除了這一個之外的其他任何條件。你的陳述顯然是不真實的。除了第一部分 - 我也懷疑這是答案。 – GlyphGryph

+0

好點!另外,看起來我錯了'nil'映射到= NULL。它映射到IS NULL,這當然是不同的。 –