验证或不验证布尔字段

时间:2016-01-13 05:34:24

标签: ruby-on-rails ruby activerecord

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

我已确认是否存在布尔字段

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

这让我想到了。我是否需要对布尔字段进行任何验证?它的价值永远是真是假还是零?即使有人恶意地试图改变它来说,一个数字,这种类型不会照顾它吗?或者上面的包含验证是否有一定的安全性?

3 个答案:

答案 0 :(得分:11)

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

您已经正确识别出,在没有其他代码验证的情况下,Rails中的布尔字段将始终(在类型强制之后)truefalsenil 。 Rails不会强制nilfalse。如果您将模型的布尔属性设置为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_eaterfalse,则不会按预期行事,您需要明确检查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;。

如果您接受Booleannil,那该对不是Boolean吗?这可以是truefalse或第三个值nil