Ruby on rails 验证或不验证布尔字段的步骤
对模型的布尔字段进行验证有什么好处吗 我对确保布尔字段的存在进行了验证Ruby on rails 验证或不验证布尔字段的步骤,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,对模型的布尔字段进行验证有什么好处吗 我对确保布尔字段的存在进行了验证 validates :boolean_attribute, presence: true 布尔值_属性为false时失败。我在谷歌上搜索了一下,发现这些问题都与这个问题有关 然后添加了这个验证 validates :field, :inclusion => {:in => [true, false]} 这让我思考。我需要对布尔字段进行任何验证吗?它的价值永远是真的、假的或零对吗?即使有人恶意地试图把它改
validates :boolean_attribute, presence: true
布尔值_属性为false时失败。我在谷歌上搜索了一下,发现这些问题都与这个问题有关
然后添加了这个验证
validates :field, :inclusion => {:in => [true, false]}
这让我思考。我需要对布尔字段进行任何验证吗?它的价值永远是真的、假的或零对吗?即使有人恶意地试图把它改成一个数字,这种类型的人难道不会在意吗?或者上面的包含验证提供了一些安全性吗?如果您想要真正的类型验证,我建议您查看gem。它将在类型强制之前对您的属性进行验证。类型强制可能有一些意外的行为,这表明只有一组特定的值是“真实的”
如果您接受一个
Boolean
为nil
,那就不是真正的Boolean
对吗?这是true
,false
或第三个值,nil
您是否应该验证布尔属性以包含在[true,false]
中完全取决于您的用例
您已经正确地识别出,在没有验证其他代码的情况下,Rails中的布尔字段将始终是(在类型强制之后)true
、false
或nil
。Rails不会将nil
强制为false
。如果将模型的布尔属性设置为nil
,并将其保存,则稍后从数据库中获取该属性时,该属性将为nil
,而不是false
您可以将nil
视为布尔字段的“第三状态”。考虑一个简单的调查应用程序,让用户保存一个未完成的调查稍后完成。假设用户保存了一个不完整的调查,但问题“你吃肉吗?”未回答。您不希望在数据库中存储false
,因为这表示用户回答了“否”。当用户回来完成调查时,您希望该问题仍然没有得到回答,因此您希望在数据库中存储nil
在上述情况下,不验证是否包含在[true,false]
中是适当的(并且是必要的)
然而,作为经验法则,我想说的是,在所有其他情况下,也就是说,在任何情况下,如果您不特定需要nil
值,那么您应该验证布尔字段是否包含在[true,false]
中
当然,如果您允许nil
,您需要小心,因为您知道,nil
在Ruby中是一个错误的值。在可能依赖于某个值的真实性或错误性的地方,必须显式检查“零”。也就是说,与此相反:
if !is_meat_eater
unanswered_questions << :is_meat_eater
end
您不需要验证
布尔值
字段,如果它不是真的,那么它就是假的
这样,无论发生什么情况,布尔值总是有一定的值:
#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
\db/migrate/add\u boolean\u column\uuuuuuuuuuuuu.rb
类AddBooleanColumn
这样,我甚至不会包含任何验证。系统将确保您将其设置为真或假-这取决于您作为开发人员。是的,我通常不介意。如果该字段是必需的-您可以使用上述技巧中的包含,并且确保在列上放置
null:false
,如果您需要值为true
或false
,但不是nil
,则需要使用验证。如果true
、false
和nil
都正常,则不需要验证。哪一个对你来说是正确的完全取决于你的用例。@Jordan:我对nil很满意,只要ruby验证它为false,并且没有可能破坏系统的场景。有吗?谢谢你@Jordan+1的场景。
#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