不推荐使用value_to_boolean; 什么是好的替代品?
在rails 3.2中是否有一个“酷孩子批准”替代ActiveRecord::ConnectionAdapters::Column.value_to_boolean
?
在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在评论中提到的,答案取决于你想用它做什么? 你想接受所有类型的字符串并将它们变成真正的布尔值吗? 或者你也控制提交结束,你可以更严格吗?
从严格到更加神奇:
嘭嘭
双重爆炸方法将任何对象转换为真实的布尔值。 第一个爆炸把它变成了它的反面,第二个变成了它的正确布尔值。
基本上, nil
和false
将变为false
,其他一切将变为true
。
!!nil # => false !!false # => false !!0 # => true !!true # => true !!"" # => true !!"false" # => true !![] # => true
适合导出到json,但在Ruby中保存时并不需要。
对象#礼物?
从ActiveSupport和blank?
的相反blank?
:
nil.present? # => false false.present? # => false 0.present? # => true "false".present? # => true "".present? # => false [].present? # => false
arrays#包括哪些内容?
指定对您来说是假的或特殊的特殊字符串:
not [nil, false, 0, '0', 'f', 'F', 'false', 'FALSE'].include?(value.presence)
或者反过来说:
[true, 1, '1', 't', 'T', 'true', 'TRUE'].include?(value)
如果您使用复选框处理表单提交,或处理外部输入并且您希望更宽松,则这些方便。 你当然可以自己决定你想接受什么。
如果值为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
似乎在Rails 4中并没有真正弃用value_to_boolean
http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean