こんばんは。
今日は「ActiveRecord::Type::Boolean.new.castの利用方法」について説明します。
ActiveRecord::Type::Boolean.new.cast メソッドは、入力された値をブール値に変換する際に注意が必要です。
なぜなら、異なるタイプの入力を許容し、それをブール値に変換する際に予想外の結果を引き起こす可能性があるからです。
どういうことか
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
そして空文字とnilはnilになる
target = nil
ActiveRecord::Type::Boolean.new.cast(target)
# => nil
target = ""
ActiveRecord::Type::Boolean.new.cast(target)
# => nil
注意点
- 明示的な変換: 可能であれば、入力を明示的にブール値に変換することを検討してください。
- ユーザー入力の検証: ユーザーからの入力を直接ブール値に変換する前に、検証や前処理を行うことが重要です。
- 予期せぬ変換: 例えば、文字列 "some text" が true に変換されることは、多くの人にとって直感的ではないかもしれません。
ActiveRecord::Type::Boolean.new.cast を使用する際は、これらの点を考慮に入れて、慎重に扱うようにしてください。
今日は以上です。
ありがとうございました。
よろしくお願いいたします。