不推荐使用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在评论中提到的,答案取决于你想用它做什么? 你想接受所有类型的字符串并将它们变成真正的布尔值吗? 或者你也控制提交结束,你可以更严格吗?

从严格到更加神奇:

嘭嘭

双重爆炸方法将任何对象转换为真实的布尔值。 第一个爆炸把它变成了它的反面,第二个变成了它的正确布尔值。

基本上, nilfalse将变为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