2011-11-13 32 views
1

在Rails應用程序中,使用ActiveRecord where方法檢查屬性是否爲空或空的最清潔方法是什麼?測試ActiveRecord查詢中的空字符串

這工作,但似乎應該有一個更好的,內置的方式做到這一點:

@items = Item.where :context => nil || '' 

很難做與谷歌福,當你搜索包括像「,其中條款。 「

+0

你'where'確實有點複雜的事情,但確實['.blank?()'](http://api.rubyonrails.org/classes/Object.html#method-i-空白-3F)幫助你呢? – sarnold

+0

上面的代碼在哪裏? 'Item.where:context.blank?()'返回一個未過濾的列表,並且'Item.where:context => .blank?()'拋出一個語法錯誤。 –

+1

'@items = Item.where:context => nil || '''不會檢查空值,因爲'nil || '''計算結果只是'',所以得到的查詢將只是'SELECT * FROM items WHERE context =''' – stereoscott

回答

-1

你可以使用這個語法:

Item.where(context: [nil, '']) 
0

我喜歡設置這樣的列的默認值來避免這個問題。

如果這不是您的選擇,那麼您將需要使用SQL子句。

@items = Item.where "`items`.`context`='' OR `items`.`context` IS NULL" 

我使用Squeel gem(http://erniemiller.org/projects/squeel/),它可以很容易地使用OR運算符。我建議檢查一下。 Squeel的一個例子是:

@items = Item.where{context.eq('') | context.eq(nil)} 
16

你有什麼行不通。

@items = Item.where context: nil || '' 

真正的計算結果爲:

@items = Item.where context: '' 

所以,你不會發現使用此方法context集項目nil

旁註

使用thing || other以這種方式永遠不會奏效。你不能寫if item == 'test' || 'something',並期望它在item'something'的情況下工作。它只適用於item'test'的情況。爲了得到像這樣的工作,你需要編寫if item == 'test' || item == 'something'。這不是人類如何說話的方式,而是計算機如何閱讀。

回到主事件

的一種方法編寫一個查詢,將工作是:

Item.where("context = ? or context = ?", nil, '') 

這讀作:找到的所有項目,其中contextnilcontext''

雖然這個工作,它並不特別被認爲是「Rails-y」。更好的辦法是:

Item.where(context: [nil, '']) 

這爲讀取:找到的所有項目,其中context[nil, '']

Related question

+2

這是正確的答案 – sixty4bit

+0

我想解釋''''和''''我製作了一些類似於'Item.where(「context =?or context =?or context =?」,nil,'',「」)''的東西。很快就找到了,我不需要''''和'''',因爲在Ruby的眼中它們是平等的。 – Tass