ruby-on-rails - 验证或不验证 bool 字段

标签 ruby-on-rails ruby activerecord

对模型的 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 字段将始终(在类型强制转换之后)truefalse,或 。 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_eaterfalse,将不会按预期运行,您需要明确检查 nil:

if is_meat_eater.nil?
  unanswered_questions << :is_meat_eater
end

关于ruby-on-rails - 验证或不验证 bool 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34759092/

相关文章:

ruby-on-rails - Rspec 和 Rails : Testing create action with invalid attributes

ruby-on-rails - Ruby on Rails - 哈希数组 - 基于键显示值

ruby-on-rails - 设计 Omniauth - 设置和定义策略

ruby-on-rails - Rails 4 actionmailer 不发送电子邮件

ruby-on-rails - 计算给定列的值总和

ruby-on-rails - 这可能在 Controller 测试中吗?

python - Ruby 和 Minecraft 数据包

Ruby - 打印彩色输出

ruby-on-rails - 在 WHERE 中重构具有两个子选择的查询

mysql - 如何获得与可排名数据模型关联的 TOP 10 标签? -- 高级 MySQL 或 ActiveRecord 查询问题