不推荐使用value_to_boolean; 什么是好的替代品?

Chr*_*s B 26 activerecord ruby-on-rails deprecated ruby-on-rails-3.2

ActiveRecord::ConnectionAdapters::Column.value_to_boolean在轨道3.2中是否有"酷孩子认可"的替代品?

Joh*_*gle 101

在Rails 4.2中,这看起来像是一种可行的方法:

 ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
Run Code Online (Sandbox Code Playgroud)

其中有哪些内容将会这样做

if value == ''
  nil
else
  ConnectionAdapters::Column::TRUE_VALUES.include?(value)
end
Run Code Online (Sandbox Code Playgroud)

或者在Rails 5中:

 ActiveRecord::Type::Boolean.new.cast(value)
Run Code Online (Sandbox Code Playgroud)

这似乎最终在这里:

  def cast_value(value)
    if value == ''
      nil
    else
      !FALSE_VALUES.include?(value)
    end
  end
Run Code Online (Sandbox Code Playgroud)

  • 对于Rails 5,今天我不得不做ActiveRecord :: Type :: Boolean.new.cast而不是type_cast. (5认同)
  • 似乎`ActiveRecord :: Type :: Boolean.new.type_cast_from_user(value)`将是一个更恰当命名的替代方案(具有相同的功能)https://github.com/rails/rails/blob/v4.2.3/了activerecord/LIB/active_record /类型/ value.rb#L33 (3认同)
  • 这应该是rails 4.2中接受的答案 (2认同)

iai*_*ain 11

正如jokklan在评论中提到的,答案取决于你想用它做什么?你想接受各种字符串并将它们变成真正的布尔值吗?或者你也控制提交结束,你可以更严格吗?

从严格到更加神奇:

嘭嘭

双重爆炸方法将任何对象转换为真实的布尔值.第一个爆炸把它变成了它的反面,第二个变成了它的正确布尔值.

基本上,nil并且false将成为false,一切将变得true.

!!nil     # => false
!!false   # => false
!!0       # => true
!!true    # => true
!!""      # => true
!!"false" # => true
!![]      # => true
Run Code Online (Sandbox Code Playgroud)

适合导出到json,但在Ruby中保存时并不需要.

对象#礼物?

从ActiveSupport和相反的blank?:

nil.present?     # => false
false.present?   # => false
0.present?       # => true
"false".present? # => true
"".present?      # => false
[].present?      # => false
Run Code Online (Sandbox Code Playgroud)

阵列#包括哪些内容?

指定对您来说是假的或特殊的特殊字符串:

not [nil, false, 0, '0', 'f', 'F', 'false', 'FALSE'].include?(value.presence)
Run Code Online (Sandbox Code Playgroud)

或者反过来说:

[true, 1, '1', 't', 'T', 'true', 'TRUE'].include?(value)
Run Code Online (Sandbox Code Playgroud)

如果您使用复选框处理表单提交,或者处理外部输入并且您希望更宽松,这些都很方便.你当然可以自己决定你想接受什么.

  • 为了防止从iain的答案中显而易见,如果你想要字符串`"false"`在使用`!!`时返回boolean`false`,就像在`!!'false"`中那样,它不会.相反,它会返回'true`,你会找到一个令人讨厌的臭虫.如果你真的只是检查存在,就像iain的回答一样,你最好不要使用Active Support Core Extensions中更明确的`#present?`或`#blank?`方法. (4认同)