对模型的 bool 字段进行验证有什么好处吗?
我有一个验证以确保 bool 字段的存在
validates :boolean_attribute, presence: true
当 boolean_attribute 为 false 时失败。我四处搜索,发现了与该问题相关的这些 SO 问题。
Rails database defaults and model validation for Boolean fields
Rails validates_presence not validating on Boolean?
然后改为添加此验证
validates :field, :inclusion => {:in => [true, false]}
这让我想到了。我是否需要对 bool 字段进行任何验证?它的值(value)永远是 true 或 false 或 nil 对吗?即使有人恶意尝试将其更改为一个数字,类型也不会处理它吗?还是上述包含验证提供了一些安全性?
最佳答案
是否应该验证 bool 属性以包含在 [ true, false ]
中完全取决于您的用例。
您已经正确地确定,在没有验证其他代码的情况下,Rails 中的 bool 字段将始终(在类型强制转换之后)true
、false
,或 无
。 Rails 不会将 nil
强制转换为 false
。如果您将模型的 bool 属性设置为 nil
并保存它,当您从稍后数据库。
您可以将 nil
视为 bool 字段的“第三种状态”。考虑一个简单的调查应用程序,它允许用户保存未完成的调查以供日后完成。假设用户保存了一个不完整的调查,问题是“你吃肉吗?”未回答。您不想在数据库中存储 false
,因为这表明用户回答“否”。当用户回来完成调查时,您希望该问题仍未得到回答,因此您希望将 nil
存储在数据库中。
在上述情况下,不验证是否包含在 [ true, false ]
中是适当的(也是必要的)。
但是,根据经验,我会说在所有其他情况下——即在任何情况下,如果您对 nil
值没有特定的需要——您应该验证 bool 字段以包含在 [ 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
关于ruby-on-rails - 验证或不验证 bool 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34759092/