【Rails】文字列をBooleanに変換する方法 (ActiveRecord::Type::Boolean.new.cast)

エンジニア
記事内に広告が含まれています。

はじめに

Rubyではboolean判定するには少し工夫が必要です。

自作でメソッドを定義することも可能ですが、ActiveRecordに便利なメソッドがあるので、

それを用いてBooleanに変換する方法をご紹介します。

 

ActiveRecord::Type::Boolean.new.castで変換する

下記のようにActiveRecordのメソッドを使用することで

文字列をBooleanに変換することができます。

ActiveRecord::Type::Boolean.new.cast('true') # => true
ActiveRecord::Type::Boolean.new.cast('false') # => false

 

コードの定義について

変換するメソッドは下記で定義されています。

rails/activemodel/lib/active_model/type/boolean.rb

module ActiveModel
  module Type

    ...
    class Boolean < Value
      FALSE_VALUES = [
        false, 0,
        "0", :"0",
        "f", :f,
        "F", :F,
        "false", :false,
        "FALSE", :FALSE,
        "off", :off,
        "OFF", :OFF,
      ].to_set.freeze

      ...
      private
        def cast_value(value)
          if value == ""
            nil
          else
            !FALSE_VALUES.include?(value)
          end
        end
    end
  end
end

大まかな処理の流れは下記の通りです。

  1. valueが空文字”” => nil
  2. valueがFALSE_VALUESに含まれる値 => false
  3. 上記でない => true

 

よく使用する変換例

‘true’‘false’以外にもよく使用するであろう値の変換結果を載せておきます。

ActiveRecord::Type::Boolean.new.cast('0') # => false
ActiveRecord::Type::Boolean.new.cast(0) # => false
ActiveRecord::Type::Boolean.new.cast('false') # => false
ActiveRecord::Type::Boolean.new.cast("FALSE") # => false
ActiveRecord::Type::Boolean.new.cast("off") # => false
ActiveRecord::Type::Boolean.new.cast("OFF") # => false

ActiveRecord::Type::Boolean.new.cast('1') # => true
ActiveRecord::Type::Boolean.new.cast(1) # => true
ActiveRecord::Type::Boolean.new.cast('true') # => true
ActiveRecord::Type::Boolean.new.cast('TRUE') # => true
ActiveRecord::Type::Boolean.new.cast('on') # => true
ActiveRecord::Type::Boolean.new.cast('ON') # => true

ActiveRecord::Type::Boolean.new.cast('') # => nil
ActiveRecord::Type::Boolean.new.cast(nil) # => nil

 

メソッドで定義して使い回す方法

下記のようにクラスメソッドで定義すれば、かなり使いやすくなるのでオススメです!!

クラスメソッドで定義する

class Utility
  def self.to_bool(value)
    ActiveRecord::Type::Boolean.new.cast(value)
  end
end

> Utility.to_bool('true')
true

Stringクラスのメソッドとして定義する

下記にようにStringクラスで定義すれば、文字列全体に適用可能です。

class String
  def to_bool
    ActiveRecord::Type::Boolean.new.cast(self)
  end
end

> 'true'.to_bool
true

コメント