列挙型 - lanchester/rails_environment GitHub Wiki

enumerize

インストール

gem 'enumerize'

bundle install

使い方

数値型のカラムでの使用を想定しています。カラムはtinyint型にするのが望ましいです。マイグレーション時にintegerlimit: 1を指定するとtinyintになります。それ以上(127個)の場合はそもそもenumerizeを使うべきではありません。

class User < ActiveRecord::Base
  extend Enumerize

  enumerize :role, in: {:user => 1, :admin => 2}
end

user = User.new
user.role = :user
user.role #=> 'user'
user.role_value #=> 1

テキストを日本語化する

config/locales/ja.ymlに日本語のテキストを書いておきます。事前にdefault_localejaになっていることを確認します。

# config/application.rb
config.i18n.default_locale = :ja`
# config/locales/ja.yml
ja:
  enumerize:
    user:
      role:
        user: ユーザー
        admin: 管理者

user = User.new(role: :admin)
user.role
#=> "admin"
user.role.text # user.role_text という書き方でも可
#=> "管理者"

設定されている値を取得する

フォームなどで値が必要な場合

User.role.find_value(:user).value #=> 1
User.role.find_value(:admin).value #=> 2

ラジオボタンやチェックボックス等でchecked:あるいはselected:にする場合は実際の値(数値)を渡します。

DBから検索する場合

scopeオプションを指定する。

class User < ActiveRecord::Base
  extend Enumerize
  enumerize :sex, :in => [:male, :female], scope: true
  enumerize :status, :in => { active: 1, blocked: 2 }, scope: :having_status
end

User.with_sex(:female)
# SELECT "users".* FROM "users" WHERE "users"."sex" IN ('female')

User.without_sex(:male)
# SELECT "users".* FROM "users" WHERE "users"."sex" NOT IN ('male')

User.having_status(:blocked).with_sex(:male, :female)
# SELECT "users".* FROM "users" WHERE "users"."status" IN (2) AND "users"."sex" IN ('male', 'female')