ActiveRecord::ConnectionAdapters::Column.value_to_boolean
在 rails 3.2 中是否有“cool-kid-approved”替代品?
4 回答
在 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
正如评论中提到的 jokklan,答案取决于你想用它做什么?你想接受各种字符串并将它们变成真正的布尔值吗?或者你也控制提交端,你能更严格吗?
从严格到更神奇:
嘭嘭
double bang 方法将任何对象转换为真正的布尔值。第一个 bang 把它变成它的对立面,第二个变成它的正确布尔值。
基本上,nil
将false
成为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)
如果您正在处理带有复选框的表单提交,或者处理外部输入并且您想要更宽松,这些非常方便。你当然可以自己决定你想接受什么。
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
看来Rails 4 http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_booleanvalue_to_boolean
并没有真正弃用