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

时间:2013-05-31 00:33:13

标签: ruby-on-rails activerecord ruby-on-rails-3.2 deprecated

是否有"酷孩子批准"在rails 3.2中替换ActiveRecord::ConnectionAdapters::Column.value_to_boolean

4 个答案:

答案 0 :(得分:98)

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

 ActiveRecord::Type::Boolean.new.type_cast_from_database(value)

有哪些内容将会这样做

if value == ''
  nil
else
  ConnectionAdapters::Column::TRUE_VALUES.include?(value)
end

或者在Rails 5中:

 ActiveRecord::Type::Boolean.new.cast(value)

这似乎最终会在这里结束:

  def cast_value(value)
    if value == ''
      nil
    else
      !FALSE_VALUES.include?(value)
    end
  end

答案 1 :(得分:12)

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

从严格到更加神奇:

bang bang

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

基本上,nilfalse将变为false,其他所有内容都将变为true

!!nil     # => false
!!false   # => false
!!0       # => true
!!true    # => true
!!""      # => true
!!"false" # => true
!![]      # => true

适合导出到json,但在Ruby中保存时并不是真的需要。

对象#本?

来自ActiveSupport,与blank?相反:

nil.present?     # => false
false.present?   # => false
0.present?       # => true
"false".present? # => true
"".present?      # => false
[].present?      # => false

阵列#包括?

指定特殊字符串,这些字符串对您来说是伪造的或真实的:

not [nil, false, 0, '0', 'f', 'F', 'false', 'FALSE'].include?(value.presence)

或者相反:

[true, 1, '1', 't', 'T', 'true', 'TRUE'].include?(value)

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

答案 2 :(得分:2)

如果值为nil / empty(''),则

ActiveRecord::Type::Boolean.new.type_cast_from_database(value)返回nil。

ActiveRecord::Type::Boolean.new.type_cast_from_database(nil) # => nil ActiveRecord::Type::Boolean.new.type_cast_from_database('') # => nil

我希望!!ActiveRecord::Type::Boolean.new.type_cast_from_database(value)一起将输入值转换为布尔值

!!ActiveRecord::Type::Boolean.new.type_cast_from_database(nil) # => false !!ActiveRecord::Type::Boolean.new.type_cast_from_database('') # => false

答案 3 :(得分:1)