web-dev-qa-db-ja.com

value_to_booleanは非推奨です。良い代替品は何ですか?

Rails 3.2)のActiveRecord::ConnectionAdapters::Column.value_to_booleanの「クールな子供が承認した」代替品はありますか?

26
Chris B

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
100
John Naegle

Jokklanがコメントで述べたように、答えはあなたがそれで何をしたいかに依存しますか?あらゆる種類の文字列を受け入れて、それらを実際のブール値に変換しますか?または、送信側も制御しますか?さらに厳密にすることはできますか?

厳格なものからより多くの魔法へ:

バンバン

Double bangメソッドは、任意のオブジェクトを実際のブール値に変換します。最初の強打はそれを反対に変え、2番目は適切なブール値に変えます。

基本的に、nilfalsefalseになり、それ以外はすべてtrueになります。

!!nil     # => false
!!false   # => false
!!0       # => true
!!true    # => true
!!""      # => true
!!"false" # => true
!![]      # => true

Jsonへのエクスポートには適していますが、Ruby内に保持する場合は実際には必要ありません。

Object#present?

ActiveSupportおよびblank?の反対から:

nil.present?     # => false
false.present?   # => false
0.present?       # => true
"false".present? # => true
"".present?      # => false
[].present?      # => false

Array#include?

偽りの、またはあなたにとって真実である特別な文字列を指定します。

not [nil, false, 0, '0', 'f', 'F', 'false', 'FALSE'].include?(value.presence)

またはその逆:

[true, 1, '1', 't', 'T', 'true', 'TRUE'].include?(value)

これらは、チェックボックスを使用してフォームの送信を処理している場合、または外部入力を処理していて、より寛大になりたい場合に便利です。もちろん、何を受け入れたいかは自分で決めることができます。

11
iain

ActiveRecord::Type::Boolean.new.type_cast_from_database(value)値がnil/empty( '')の場合、nilを返します。

ActiveRecord::Type::Boolean.new.type_cast_from_database(nil) # => nilActiveRecord::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

2
geekdev

value_to_booleanは実際には非推奨ではありませんRails 4 http://www.rubydoc.info/docs/Rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean

1
dolzenko