2016-01-13 64 views
8

對布爾型字段模型進行驗證有什麼好處嗎?驗證或不驗證布爾型字段

我有一個驗證,以確保一個布爾字段

validates :boolean_attribute, presence: true 

它失敗時b​​oolean_attribute是假的存在。我搜索了一下,發現了與這個問題有關的SO問題。

Rails database defaults and model validation for Boolean fields
Rails validates_presence not validating on Boolean?

加入此確認,而不是

validates :field, :inclusion => {:in => [true, false]} 

這讓我想想。我是否需要對布爾字段進行任何驗證?它的價值永遠是真的還是假的或無對的?即使有人惡意地試圖改變它說一個數字,這種類型是不是會照顧它呢?或者上述包含驗證提供了一些安全性嗎?

+0

是的,我通常不打擾。如果該字段是強制性的 - 您可以使用上面的包含技巧,並確保在列上放置'null:false' –

+0

如果您需要該值爲「true」或「false」而不是「nil」,那麼你想使用驗證。如果'true','false'和'nil'都可以,你不需要驗證。哪些對你來說是正確的取決於你的用例。 –

+0

@Jordan:只要ruby驗證它爲false並且沒有可能會破壞系統的場景,我就會很酷。有沒有? –

回答

8

是否應該驗證包含在[ true, false ]中的布爾屬性完全取決於您的用例。

你已經正確識別的是,在沒有其他代碼的驗證,在Rails的一個布爾字段將永遠是(後強制類型轉換)truefalse,或nil。 Rails不會強制nilfalse。如果將模型的布爾屬性設置爲nil並保存,則當您稍後從數據庫中獲取該屬性時,該屬性將爲nil,而不是false

您可以將nil視爲布爾型字段的「第三個狀態」。考慮一個簡單的調查應用程序,可以讓用戶保存未完成的調查以便稍後完成。假設用戶保存一個不完整的調查問題「你吃肉嗎?」無人接聽。您不希望將false存儲在數據庫中,因爲這會指示用戶回答「否」。當用戶回來完成調查時,您希望該問題仍然沒有得到答覆,因此您要將nil存儲在數據庫中。

在上述情況下,不適用以驗證是否包含在[ true, false ]中。

然而,作爲一個經驗法則,我會說在所有其他情況下 - 即,在任何情況下,如果您沒有具體的需要對於nil的值 - 您應該驗證布爾字段以包含在[ true, false ]中。

當然,如果你允許nil你需要小心,因爲,如你所知,nil是在Ruby falsey值。您必須在可能依賴價值的真實性或虛假性的地方明確檢查「無效」。也就是說,不是這個,:

if !is_meat_eater 
    unanswered_questions << :is_meat_eater 
end 

...如預期,不會表現如果is_meat_eaterfalse,你需要明確檢查nil

if is_meat_eater.nil? 
    unanswered_questions << :is_meat_eater 
end 
+0

Thankyou @Jordan +1的場景。 –

+0

upvoted的努力:) –

0

如果你想真正的類型驗證,我會說檢查出validates_type寶石。它將在類型強制之前對您的屬性進行驗證。類型強制可能會有一些意想不到的行爲,this answer顯示了只有一組值是「truthy」。

如果您接受Booleannil,那不是真的Boolean對不對?這可以是true,false或第三個值nil

4

你不需要驗證boolean字段,如果不是真的,則爲假

只是set a "default" in your db使得布爾總是要具有一定的價值無論是什麼:

#db/migrate/add_boolean_column_______.rb 
class AddBooleanColumn < ActiveRecord::Migration 
    def change 
     change_table :table do |t| 
     t.boolean :field, default: false 
     end 
    end 
end 

這樣一來,我甚至不會有任何驗證。系統將確保您將其設置爲真或假 - 這取決於開發人員。