28

ActiveRecord::ConnectionAdapters::Column.value_to_boolean在 rails 3.2 中是否有“cool-kid-approved”替代品?

4

4 回答 4

107

在 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
于 2014-08-26T19:50:51.963 回答
12

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

从严格到更神奇:

嘭嘭

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)

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

于 2013-06-22T20:34:07.643 回答
1

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

于 2015-05-16T22:48:45.430 回答
0

看来Rails 4 http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_booleanvalue_to_boolean并没有真正弃用

于 2014-04-07T12:31:39.563 回答