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,false或nil.Rails会不会把nil对false.如果您将模型的布尔属性设置为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)
您不需要验证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 - 这取决于您作为开发人员.
| 归档时间: |
|
| 查看次数: |
4869 次 |
| 最近记录: |