验证Rails ActiveRecord中的布尔字段

Ser*_*gey 3 ruby-on-rails rails-activerecord

我需要验证Rails ActiveRecord对象的布尔字段.我用这个问题的常见解决方案:

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

但是虽然这个解决方案解决了验证false值的问题,但它仍然允许将字符串保存到boolean_field:

my_object.boolean_field = "string"
my_object.save # => true
my_object.boolean_field # => false
Run Code Online (Sandbox Code Playgroud)

如果我将包含指定为[true, false]?为什么会发生这种情况?更重要的是,我如何验证真值和假值?

PS如果这个问题很重要,我正在使用PostgreSQL.

Raj*_*ngh 6

您可以通过检查数据类型进行验证,您可以使用is_a?并传递数据类型的类名作为参数

pry(main)> a = "aaaaa"
=> "aaaaa"
pry(main)> a.is_a?(Boolean)
=> false
Run Code Online (Sandbox Code Playgroud)

由于它是一个返回的字符串false,现在尝试使用boolean

pry(main)> b = true
=> true
pry(main)> b.is_a?(Boolean)
=> true
Run Code Online (Sandbox Code Playgroud)

使用此逻辑添加自定义验证

validate :check_boolean_field

def check_boolean_field
  errors.add(...) unless boolean_field.is_a?(Boolean)
end
Run Code Online (Sandbox Code Playgroud)