Enumとは?
Rails4.1から使えるようになった「ActiveRecord::Enum」というモジュールのことです。
実装方法
対象カラム
integer型のカラムが対象になります。
モデルクラス
下記のように対象からむにenumを定義します。
1 2 3 |
class User < ApplicationRecord enum 対象カラム名: [ :設定値1, :設定値2 ] end |
設定値1には「0」、設定値2には「1」というように前から順番に設定値に紐づく値が設定されていきます。
値を入れてみる。
1 |
User.create(gender:0,name:"次郎") |
rails consoleで確認すると下記のように指定すると数値ではなく設定値が帰って来ます。(なお、データベースにはちゃんと数値が挿入されているのでご心配なく!)
1 2 3 |
>> User.find(2).gender User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] => "male" |
下記のようにカラム名に「s」をつけてあげるとHashを取得できます。
1 2 |
>> User.genders => {"male"=>0, "famale"=>1} |
Enumerize
enumと似たようなことができますが、機能豊富なGemで実際に開発現場でもよく使われています。
メリット
Enumに比べると具体的に下記のようなメリットがあります。
- デフォルトでi18n対応
- デフォルト値設定
- scope名設定の柔軟さ
実例
下記のようにモデルに対して「extend Enumerize」を記述します。
1 2 3 4 5 |
class User < ApplicationRecord extend Enumerize enumerize :gender, in: { male: 0, famale: 1 } end |
下記のように記述すれば、値を取得できます。(DBにはintegerの値が入っていますが、integerに対応する値を取得できます。)
1 2 3 4 |
>> User.find(7).gender (0.7ms) SELECT sqlite_version(*) User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]] => "famale" |
数値を取得したい場合は下記のように「_value」を付けます。
1 2 3 |
>> User.find(7).gender_value User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]] => 1 |
デフォルト値
下記のようにdefaultを指定することでデフォルト値を設定することが可能です。(例で言えば「male」)、Rails標準のenumで実装しようとしたらマイグレーションの中でデフォルト値を指定する必要がある。
1 2 3 4 5 |
class User < ApplicationRecord extend Enumerize enumerize :gender, in: { male: 0, famale: 1 },default: :male end |
i18n対応
標準のenumで対応しようとしたら「enum_help」を使わないといけません。
config/locales/ja.yml
1 2 3 4 5 6 |
ja: enumerize: user: gender: male: 男 famale: 女 |
翻訳された文字を取得したい場合は下記のように「_text」を付けます。
1 2 3 |
>> User.find(2).gender_text User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] => "男" |
この記事へのコメントはありません。