【问题标题】:value_to_boolean deprecated; what's a good replacement?value_to_boolean 已弃用;什么是好的替代品?
【发布时间】:2013-05-31 00:33:12
【问题描述】:

rails 3.2 中是否有“酷孩子认可”的 ActiveRecord::ConnectionAdapters::Column.value_to_boolean 替代品?

【问题讨论】:

  • 你能给出一个用例,或者更多细节吗?您始终可以使用 !! 将任何值更改为布尔值。例如。 !!nil 为假,!!1 为真。
  • [false, 0, '0', 'f', 'F', 'false', 'FALSE'].map { |v| !!v } 产生[false, true, true, true, true, true, true]。这显然不是替代品。

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


【解决方案1】:

在 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

【讨论】:

  • 看来ActiveRecord::Type::Boolean.new.type_cast_from_user(value) 是一个更合适命名的替代方案(具有相同的功能)github.com/rails/rails/blob/v4.2.3/activerecord/lib/…
  • 对于 Rails 5,今天我必须使用 ActiveRecord::Type::Boolean.new.cast 而不是 type_cast。
  • 谢谢,会更新。我已经有一段时间没有使用 Rails 5 了。
  • `ActiveRecord::Type::Boolean.new.cast(value)`
  • 有一个小问题:value_to_boolean 用于将 nil 转换为 false,type_cast_from_database 没有(在这种情况下它返回 nil)。如果您有例如,这可能会导致错误。非空约束。
【解决方案2】:

正如 jokklan 在 cmets 中提到的,答案取决于你想用它做什么?你想接受各种字符串并将它们变成真正的布尔值吗?还是你也控制提交端,能不能严格一点?

从严格到更神奇:

砰砰

double bang 方法将任何对象转换为真正的布尔值。第一个 bang 把它变成它的对立面,第二个变成它的正确布尔值。

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

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

适合导出为 json,但在保存在 Ruby 中时并不真正需要。

对象#present?

来自 ActiveSupport 和 blank? 的对立面:

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

数组#include?

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

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

或者反过来:

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

如果您正在处理带有复选框的表单提交,或者处理外部输入并且您想要更加宽松,这些非常方便。您当然可以自己决定要接受什么。

【讨论】:

  • 感谢您提供的所有信息。看起来!! 是我正在寻找的语法糖......
  • 以防万一从 iain 的回答中看不出来,如果您希望字符串 "false" 在使用 !! 时返回布尔值 false,就像在 !!"false" 中一样,它不会。相反,它会返回true,你会发现一个令人讨厌的错误。如果你在 Rails 中真的只检查存在,就像 iain 的回答那样,你最好使用 Active Support Core Extensions 中更明确的 #present?#blank? 方法。
【解决方案3】:

ActiveRecord::Type::Boolean.new.type_cast_from_database(value) 如果值为 nil/empty(''),则返回 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

【讨论】:

  • 感谢您的质量保证!
【解决方案4】:

在 Rails 4 http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean 中似乎并没有真正弃用 value_to_boolean

【讨论】:

  • 我认为它没有被弃用,但他们在类中添加了 stopdoc,我认为这意味着它仅供内部使用。
  • 它在 Rails 4.2 中被移除
猜你喜欢
  • 2016-05-25
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2017-12-17
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多