是否有"酷孩子批准"在rails 3.2中替换ActiveRecord::ConnectionAdapters::Column.value_to_boolean
?
答案 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在评论中提到的,答案取决于你想用它做什么?你想接受各种字符串并将它们变成真正的布尔值吗?或者你也控制提交结束,你可以更严格吗?
从严格到更加神奇:
双重爆炸方法将任何对象转换为真实的布尔值。第一个爆炸把它变成了它的反面,第二个变成了它的正确布尔值。
基本上,nil
和false
将变为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)
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)
在Rails 4 http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean
中似乎并未真正弃用value_to_boolean