列挙型 - lanchester/rails_environment GitHub Wiki
enumerize
インストール
gem 'enumerize'
bundle install
使い方
数値型のカラムでの使用を想定しています。カラムはtinyint
型にするのが望ましいです。マイグレーション時にinteger
にlimit: 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_locale
がja
になっていることを確認します。
# 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')