環境
・Ruby 2.6.4
・Rails 5.2.3
enum(enumeration: 列挙)とは
・数値のカラムの対してプログラム上で別名を与える役割。
・名前を整数の定数に割り当てるのに使われるデータ型
・名前に数値を割り当てることで、コードの可読性を上げて、かつ不要な不具合を防いでくれるもの
・ActiveRecord::EnumはRails 4.1で導入された。enumの属性値はデータベース内の整数に対応付けられるが、クエリでは名前で参照できる。
・• enum型の定数は定義されている以外の値を受け付けない(例外が発生)
使用方法
1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加
2.userモデルにenumの定義をする
1.usersテーブルにenum用のカラム(roleカラム,データ型はinteger型)を追加
rails g migration AddRoleToUsers
class AddRoleToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :role, :integer, null: false, default: 0
end
end
#null: falseにしているのは奴隷/王様は必ず必要なため
#初期値は奴隷にしたいので、default: 0
rails db:migrate
2.userモデルにenumの定義をする
app/model/user.rb
class User < ApplicationRecord
・
・
・
enum role: { slave: 0, king: 1 }
end
・roleカラムに数値が保存される
・数値によって奴隷か王様か区別
コンソールで確かめていく
pry(main)> User.roles
=> {"slave"=>0, "king"=>1}
key,valueも指定して取得できるようになる
pry(main)> User.roles.keys
=> ["slave", "king"]
pry(main)> User.roles.values
=> [0, 1]
King(王様)にする方法は
コンソール上で
pry(main)> user = User.first
id: 1
email: "tenshin@example.com"
first_name: "メイウェザー"
last_name: "フロイド"
role: "slave"
pry(main)> user.king!
pry(main)> user.king?
=> true
とすることでkingにすることができる
使用例
プルダウン形式のフォームは通常、下記のようにf.select
を用いる。
<%= f.select カラム名, {'選択肢': DBに保存する値}, {オプション}, {classなどの要素} %>
key
をそのまま使う場合 to_a
<%= f.select :role, User.roles.keys.to_a, {}, class: 'form-control' %>
モデルクラス.enumカラム名の複数形
でハッシュ形式で取得できる。
User.roles
=> {"slave"=>0, "king"=>1}
.to_aメソッドはハッシュを配列に変換するメソッド
日本語化してみよう
gem 'enum_help'
bundle install
config/locales/activerecord/ja.yml
ja:
enums:
user:
role:
slave: '奴隷'
king: '王様'
日本語化したのを呼び出す方法
・カラムの後に_i18n
を付ける
・ただ、モデルに対して呼び出すときはカラムは複数形。
・モデルのインスタンスなどを呼び出すときのカラムは単数形。
User.roles_i18n
=> {"slave"=>"奴隷", "king"=>"王様"}
@user.role_i18n
=> "王様"
valueである数値(0,1)が日本語になる
enum_helpを利用して記述すると
<%= f.select :role, User.roles_i18n.invert, {}, class: 'form-control' %>
=> {"奴隷"=>"slave", "王様"=>"king"}
.invertメソッドでkeyとvalueが入れ替えられるよって、下記のように値である0(奴隷)や1(王様)がDBに保存される
もしinvertメソッドを使用しないと
<%= f.select :role, User.roles_i18n, {}, class: 'form-control' %>
=> {"slave"=>"奴隷", "king"=>"王様"}
となりkeyが保存されることになるので。プルダウン方式のところに日本語化されていない(slave or king)が表示されてしまう
奴隷や王様で一般/管理者を表すと少し面白い。。