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がコメントで述べたように、答えはあなたがそれで何をしたいかに依存しますか?あらゆる種類の文字列を受け入れて、それらを実際のブール値に変換しますか?または、送信側も制御しますか?さらに厳密にすることはできますか?
厳格なものからより多くの魔法へ:
Double bangメソッドは、任意のオブジェクトを実際のブール値に変換します。最初の強打はそれを反対に変え、2番目は適切なブール値に変えます。
基本的に、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)
これらは、チェックボックスを使用してフォームの送信を処理している場合、または外部入力を処理していて、より寛大になりたい場合に便利です。もちろん、何を受け入れたいかは自分で決めることができます。
ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
値がnil/empty( '')の場合、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
value_to_boolean
は実際には非推奨ではありませんRails 4 http://www.rubydoc.info/docs/Rails/ActiveRecord/ConnectionAdapters/Column.value_to_boolean