验证或不验证布尔字段

sud*_*ang 14 ruby activerecord ruby-on-rails

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

我有一个确认存在布尔字段的验证

validates :boolean_attribute, presence: true
Run Code Online (Sandbox Code Playgroud)

当boolean_attribute为false时失败.我搜索了一下,发现了与这个问题相关的问题.

Rails数据库默认值和布尔字段的模型验证
Rails validates_presence不在布尔值上验证?

然后添加此验证

 validates :field, :inclusion => {:in => [true, false]}
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*ing 11

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

你已经正确识别的是,在没有其他代码的验证,在Rails的一个布尔字段将永远是(类型强制转换后)true,falsenil.Rails会不会把nilfalse.如果您将模型的布尔属性设置为nil并保存它,那么当您稍后从数据库中获取该属性时,该属性将nil不会false.

您可以将其nil视为布尔字段的"第三状态".考虑一个简单的调查应用程序,它允许用户保存未完成的调查以便稍后完成.假设用户保存一份不完整的调查问题"你吃肉吗?" 无人接听.您不希望存储false在数据库中,因为这表明用户回答"否".当用户返回完成调查时,您希望该问题仍然无法回答,因此您希望存储nil在数据库中.

在类似上述情况下,这是合适的(和必要的)验证列入[ true, false ].

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

当然,如果你这样做nil你需要小心,因为,如你所知,nil是一个falsey在Ruby中值.你必须在你可能依赖于价值的真实性或虚假性的地方明确地检查"无效".也就是说,而不是这个:

if !is_meat_eater
  unanswered_questions << :is_meat_eater
end
Run Code Online (Sandbox Code Playgroud)

...如果is_meat_eater不是false,那么你需要明确地检查nil:

if is_meat_eater.nil?
  unanswered_questions << :is_meat_eater
end
Run Code Online (Sandbox Code Playgroud)


Ric*_*eck 5

您不需要验证boolean字段,如果不是,则为假.

只需在数据库中设置一个"默认值",这样无论如何,bool总是会有一定的值:

#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 
Run Code Online (Sandbox Code Playgroud)

这样,我甚至不会包含任何验证.系统将确保您将其设置为true或false - 这取决于您作为开发人员.