はじめに
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
大まかな処理の流れは下記の通りです。
- valueが空文字”” => nil
- valueが
FALSE_VALUES
に含まれる値 => false - 上記でない => 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
コメント