【问题标题】:To validate or not to validate boolean field验证或不验证布尔字段
【发布时间】:2016-01-13 05:34:23
【问题描述】:

对模型的布尔字段进行验证有什么好处吗?

我已验证是否存在布尔字段

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]}

这让我思考。我是否需要对布尔字段进行任何验证?它的值将永远是 true 或 false 或 nil 对吗?就算有人恶意改成一个数字,类型不会管它吗?还是上述包含验证提供了一些安全性?

【问题讨论】:

  • 是的,我通常不打扰。如果该字段是强制性的 - 您可以使用上面的包含技巧,并确保将 null: false 放在列上
  • 如果您需要值为truefalse 而不是nil,那么您想使用验证。如果truefalsenil 都可以,则不需要验证。其中哪一个对您来说是正确的完全取决于您的用例。
  • @Jordan:我对 nil 很满意,只要 ruby​​ 将它验证为 false 并且没有可能破坏系统的场景。有吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您是否应该验证布尔属性以包含在 [ true, false ] 中完全取决于您的用例。

您已经正确地确定,在没有验证其他代码的情况下,Rails 中的布尔字段将始终是(在类型强制之后)truefalsenil。 Rails 不会将nil 强制转换为false。如果您将模型的布尔属性设置为nil 并保存,则稍后从数据库中获取该属性时,该属性将是nil,而不是false

您可以将nil 视为布尔字段的“第三种状态”。考虑一个简单的调查应用程序,它允许用户保存未完成的调查以供以后完成。假设用户保存了一个带有“你吃肉吗?”的问题的不完整调查。没有回答。您不想将false 存储在数据库中,因为这表明用户回答“否”。当用户回来完成调查时,您希望该问题仍未得到解答,因此您希望将 nil 存储在数据库中。

在上述情况下,验证是否包含在[ true, false ] 中是合适的(也是必要的)不是

但是,根据经验,我会说在所有其他情况下——即在您对nil 值没有特定需要的任何情况下,您都应该验证布尔字段以包含在[ true, false ] 中。

当然,如果您允许允许nil,则需要小心,因为如您所知,nil 在 Ruby 中是 falsey 值。您必须在可能依赖值的真实性或虚假性的地方显式检查“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

【讨论】:

  • 感谢@Jordan +1 的场景。
【解决方案2】:

您不需要验证 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 - 这取决于您作为开发人员。

【讨论】:

    【解决方案3】:

    如果您想要真正的类型验证,我建议您查看validates_type gem。它将在 类型强制之前对您的属性进行验证。类型强制可能有一些意想不到的行为,this answer 表明只有一组值是“真实的”。

    如果您接受 Booleannil,那不是真正的 Boolean 对吗?这是truefalse 或第三个值nil

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2014-06-05
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多