Подтвердить что ты не робот

Value_to_boolean устарел; какая хорошая замена?

Есть ли замена "t20" на "рельсы 3.2"

4b9b3361

Ответ 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