对模型的布尔字段进行验证有什么好处吗?
我已确认是否存在布尔字段
validates :boolean_attribute, presence: true
当boolean_attribute为false时失败。我用Google搜索并发现了与此问题相关的问题。
Rails database defaults and model validation for Boolean fields
Rails validates_presence not validating on Boolean?
然后添加此验证
validates :field, :inclusion => {:in => [true, false]}
这让我想到了。我是否需要对布尔字段进行任何验证?它的价值永远是真是假还是零?即使有人恶意地试图改变它来说,一个数字,这种类型不会照顾它吗?或者上面的包含验证是否有一定的安全性?
答案 0 :(得分:11)
是否应该验证包含在[ true, false ]
中的布尔属性完全取决于您的用例。
您已经正确识别出,在没有其他代码验证的情况下,Rails中的布尔字段将始终(在类型强制之后)true
,false
或nil
。 Rails不会强制nil
到false
。如果您将模型的布尔属性设置为nil
并保存它,那么当您稍后从数据库中获取该属性时,该属性将为nil
,而不是false
。
您可以将nil
视为布尔字段的“第三状态”。考虑一个简单的调查应用程序,它允许用户保存未完成的调查以便稍后完成。假设用户保存一份不完整的调查问题“你吃肉吗?”无人接听。您不希望将false
存储在数据库中,因为这表示用户回答“否”。当用户返回完成调查时,您希望该问题仍未得到答复,因此您希望将nil
存储在数据库中。
在上述情况下,验证是否包含在[ true, false ]
中是合适的(并且必要的) 。
然而,根据经验,我会说在所有其他情况下 - 即。如果您没有nil
值的特定需要,则应验证布尔字段以包含在[ true, false ]
中。
当然,如果您 允许nil
,您需要小心,因为如您所知,nil
是 falsey Ruby中的价值。你必须在你可能依赖于价值的真实性或虚假性的地方明确地检查“nilness”。也就是说,而不是:
if !is_meat_eater
unanswered_questions << :is_meat_eater
end
...如果is_meat_eater
为false
,则不会按预期行事,您需要明确检查nil
:
if is_meat_eater.nil?
unanswered_questions << :is_meat_eater
end
答案 1 :(得分:5)
您无需验证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
这样,我甚至不会包含任何验证。系统将确保您将其设置为true或false - 这取决于您作为开发人员。
答案 2 :(得分:0)
如果您想要真正的类型验证,我请查看validates_type
gem。它将对您的属性进行验证类型强制。类型强制可以有一些意想不到的行为,this answer显示只有一组特定的值是如何&#34; truthy&#34;。
如果您接受Boolean
为nil
,那该对不是Boolean
吗?这可以是true
,false
或第三个值nil
。