Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

【Rails】Enum - EnumerizeとActiveRecord::Enum

Rails(正確にはActiveRecord)のバージョンによって選択肢が変わってくる

ActiveRecord 4.1未満

Enumerize gemが便利.

gem 'enumerize'
class User < ActiveRecord::Base
  extend Enumerize

  enumerize :role, in: %i(user admin), default: :user
end

ActiveRecord 4.1以降

ActiveRecord::Enumが登場.

class User < ActiveRecord::Base
  enum role: %i(user admin)
end

デフォルト値はmigration時に指定.

create_table :users do |t|
  t.column :role, :integer, default: 0
end

ただ,配列で指定しちゃうと変更が発生した時に危険なので,Hashで格納する値を決めておく.

class User < ActiveRecord::Base
  enum role: { user: 10, admin: 0 }
end

比較

  • Enumerizeはi18nにも対応
  • 述語メソッド(e.g. user.admin?)はどっちも使える
  • 破壊的変更(e.g. user.admin!)はActiveRecord::Enumのみ
  • 検索
    • Enumerize => User.with_role(:admin)without_rolerole.find_valueなども生えてくる)
    • ActiveRecore::Enum => User.admin
  • Enumerizeは他にもi18n対応,複数の値持てる,select用のoption吐けるなど高性能

参考