0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActiveRecord::Type::Boolean.new.castの利用方法

Posted at

こんばんは。

今日は「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

また、""nilnil になる

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 を使用する際は、これらの点を考慮に入れて、慎重に扱うようにしてください。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?