在Rails 3.2中,是否有一个“酷孩子认可”的替代方法来替换ActiveRecord::ConnectionAdapters::Column.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
ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
会是一个更合适命名的替代方案(具有相同的功能) https://github.com/rails/rails/blob/v4.2.3/activerecord/lib/active_record/type/value.rb#L33 - Manuel Meurer ActiveRecord::Type::Boolean.new.cast(value)
- Jakevalue_to_boolean
用于将 nil 转换为 false,而 type_cast_from_database
不会这样做(在这种情况下它会返回 nil)。如果您有非空约束,则可能会导致错误。 - fabi:''
被转换为 true
(我正在将可以为 nil 的布尔列转换为本地化字符串)。 - Goulvennil
和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)
如果您正在处理带有复选框的表单提交,或者处理外部输入并希望更加宽容,则这些非常方便。当然,您可以自己决定要接受什么。
!!
是我正在寻找的语法糖... - Chris B"false"
在使用!!
时返回布尔值false
,那么就像 iain 的回答一样,这并不明显。使用 !!"false"
会返回true
,你将不得不找到一个麻烦的 bug。如果你在 Rails 中只是想检查是否存在,那么最好使用 Active Support Core Extensions 中更明确的#present?
或#blank?
方法。 - Chad MActiveRecord::Type::Boolean.new.type_cast_from_database(value)
如果值为nil/空(''),则返回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
!!
将任何值转换为布尔值。例如,!!nil
会变成假,而!!1
会变成真。 - jokklan[false, 0, '0', 'f', 'F', 'false', 'FALSE'].map { |v| !!v }
返回[false, true, true, true, true, true, true]
时,显然这并不是一种替代方法。 - Gunchars