在Rails應用程序中,使用ActiveRecord where
方法檢查屬性是否爲空或空的最清潔方法是什麼?測試ActiveRecord查詢中的空字符串
這工作,但似乎應該有一個更好的,內置的方式做到這一點:
@items = Item.where :context => nil || ''
很難做與谷歌福,當你搜索包括像「,其中條款。 「
在Rails應用程序中,使用ActiveRecord where
方法檢查屬性是否爲空或空的最清潔方法是什麼?測試ActiveRecord查詢中的空字符串
這工作,但似乎應該有一個更好的,內置的方式做到這一點:
@items = Item.where :context => nil || ''
很難做與谷歌福,當你搜索包括像「,其中條款。 「
你可以使用這個語法:
Item.where(context: [nil, ''])
我喜歡設置這樣的列的默認值來避免這個問題。
如果這不是您的選擇,那麼您將需要使用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)}
你有什麼行不通。
@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, '')
這讀作:找到的所有項目,其中context
是nil
或context
是''
。
雖然這個工作,它並不特別被認爲是「Rails-y」。更好的辦法是:
Item.where(context: [nil, ''])
這爲讀取:找到的所有項目,其中context
是[nil, '']
。
你'where'確實有點複雜的事情,但確實['.blank?()'](http://api.rubyonrails.org/classes/Object.html#method-i-空白-3F)幫助你呢? – sarnold
上面的代碼在哪裏? 'Item.where:context.blank?()'返回一個未過濾的列表,並且'Item.where:context => .blank?()'拋出一個語法錯誤。 –
'@items = Item.where:context => nil || '''不會檢查空值,因爲'nil || '''計算結果只是'',所以得到的查詢將只是'SELECT * FROM items WHERE context =''' – stereoscott