昔のPHPを彷彿とさせる変換だったので書き留める
環境
$ bin/rails --version Rails 6.0.3.6
どういうことか
ActiveRecord::Type::Boolean.new.cast
は引数をtrueあるいはfalseに変換してくれるのだが、変換の基準は以下のものに引っかかるものがfalseになる。
クラスとしてはこちらに定義がある。
FALSE_VALUES = [ false, 0, "0", :"0", "f", :f, "F", :F, "false", :false, "FALSE", :FALSE, "off", :off, "OFF", :OFF, ].to_set.freeze
また、""
と nil
は nil
になる
def cast_value(value) if value == "" nil else !FALSE_VALUES.include?(value) end end
つまり以下のものはすべて false
に変換される
false
0
"0"
:0
"false"
:false
"FALSE"
:FALSE
"off"
:off
"OFF"
:OFF
また、 以下のものは nil
になる
nil
""
そしてそれ以外のものは true
になる。
例
false
になるシリーズは以下
target = "f" ActiveRecord::Type::Boolean.new.cast(target) # => false target = 0 ActiveRecord::Type::Boolean.new.cast(target) # => false target = "false" ActiveRecord::Type::Boolean.new.cast(target) # => false target = false ActiveRecord::Type::Boolean.new.cast(target) # => false target = "FALSE" ActiveRecord::Type::Boolean.new.cast(target) # => false target = "off" ActiveRecord::Type::Boolean.new.cast(target) # => false target = :off ActiveRecord::Type::Boolean.new.cast(target) # => false target = :false ActiveRecord::Type::Boolean.new.cast(target) # => false target = :FALSE ActiveRecord::Type::Boolean.new.cast(target) # => false target = 0 ActiveRecord::Type::Boolean.new.cast(target) # => false target = 1 ActiveRecord::Type::Boolean.new.cast(target) # => true
ただし False
(いわゆるパスカルケース)は設定値にないので true
になる
target = :False ActiveRecord::Type::Boolean.new.cast(target) # => true target = "False" ActiveRecord::Type::Boolean.new.cast(target) # => true
target = nil ActiveRecord::Type::Boolean.new.cast(target) # => nil target = "" ActiveRecord::Type::Boolean.new.cast(target) # => nil