Есть ли замена "t20" на "рельсы 3.2"
Value_to_boolean устарел; какая хорошая замена?
Ответ 1
В 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
Ответ 2
Как упоминается в комментариях jokklan, ответ зависит от того, что вы хотите с ним делать? Вы хотите принять всевозможные строки и превратить их в настоящие булевы? Или вы также контролируете отправку, и можете ли вы быть более строгим?
От строгих до более магии:
bang bang
Метод double bang преобразует любой объект в реальное булево. Первый взлом превращает его в противоположное, второе - правильное логическое значение.
В принципе, 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)
Это удобно, если вы обрабатываете формы с помощью флажков или обрабатываете внешний вход, и хотите быть более мягкими. Вы можете сами решить, что хотите принять.
Ответ 3
ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
return nil, если значение равно nil/empty ('').
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)
для преобразования входного значения в boolean
!!ActiveRecord::Type::Boolean.new.type_cast_from_database(nil) # => false
!!ActiveRecord::Type::Boolean.new.type_cast_from_database('') # => false
Ответ 4
Похоже, что value_to_boolean
на самом деле не устарел в Rails 4 http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean