LoginSignup
20
7

More than 5 years have passed since last update.

Rails enumの闇 整数値(integer)の代わりにbooleanを設定すると死ぬ

Last updated at Posted at 2018-05-24

何かと便利でよく使われるenum

enumは列挙型と訳され、enumを使えば文字の配列に整数を順番に割り当てることができます。
なので、他のプログラマーに読みやすいコードを書くことができます。(可読性が上がる)
整数値の範囲が決定されるので誤った数値を使ってしまうことを前もって、防げます。
参考:https://www.sejuku.net/blog/26369

基本的な使い方はこちら↓
enumは整数値(0,1,2,3・・・)をにキーワードを割り当てて抽象化することができる
コードの可読性が上がるので、とても便利です

hoge.rb
class Hoge < ActiveRecord::Base
  enum department_status: {
    unselected: 0,
    human_resourse: 1,
    development: 2,
    corporate: 3,
    other_department: 99
  }
end

@hoge = Hoge.new(department_status: :development)
@hoge.department_status # => "development"

#設定したKeyがmethodとして使えるようになる
@hoge.corporate? # => false
@hoge.development? # => true

だが、enumにはがあった...
基本的なenumの使い方としては整数値を抽象化することです
しかし、あるソースコードを読んでいるときに整数値の代わりにbooleanを入れているのを見かけた

fuga.rb
class Fuga < ActiveRecord::Base
  enum is_target_country: {
    is_target_japan: true,
    is_not_target_other: false
  }
end

#  is_target_countryカラムの初期値は以下でデフォルトでtrueが入っている
#  is_target_country  :boolean  default(TRUE)

@fuga = Fuga.new
@fuga.is_target_country # => "is_target_japan"
@fuga.is_target_japan? # => true

ここでis_target_countryにfalseを入れようとすると問題が起きる

# falseを入れてみる
@fuga.is_target_country = false # => false
#問題なくfalseが返ってくる

#しかし、改めて@fuga.is_target_countryを確認してみると・・・

@fuga.is_target_country # => nil
#nilが入ってしまっている・・・(恐怖!!!)

なぜかfalseを入れるとnilに変換される
おそらく、enumがfalseが入ってきた時はnilに変換している?

さすがにenumにbooleanを設定している人は少ないと思うが、もししている人が入れば注意して欲しい

20
7
1

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
20
7