Rails 4到5 AR布尔值弃用

时间:2016-04-01 14:46:56

标签: ruby-on-rails activerecord

我有一个模型愿望包含before_validation调用的波纹管方法:

def set_to_false
  self.confirme ||= false
  self.deny ||= false
  self.favoris ||= false
  self.code_valid ||= false
end

当我运行测试时,我收到了弃用消息

  

弃权警告:您试图分配的值不是   显式truefalse到布尔列。目前这个价值   施放到false。这将改变以匹配Ruby的语义,并且会   在Rails 5中转换为true。如果你想保持当前状态   行为,您应该显式处理您想要转换的值   到false。 (来自cast_value at   ./Ruby2.1.0/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/type/boolean.rb:17)

我知道我必须投,但我找不到一种简单而聪明的方法来做到这一点。任何删除此弃用的帮助都会很棒。

1 个答案:

答案 0 :(得分:4)

这是一个我经常使用的简单的布尔化技巧,双重否定:

before_validation :booleanify

def booleanify
  self.confirm = !!confirm
  self.deny = !!deny
  ...
end

如果你不熟悉这个技巧,根据ruby规则(nilfalse成为false,它会将所有值转换为它们的布尔值等价物,一切否则变为true

'foo' # => "foo"
!'foo' # => false
!!'foo' # => true

!nil # => true
!!nil # => false