はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在最終のポートフォリオの要件定義を作成中です。そこで知ったのがenum
機能です。
この記事では、enum
について解説していきたいと思います
✅ enum とは?
enum
は、整数カラムに対して、意味のある名前をつけて扱えるようにする Rails の機能です。
例えば、role: integer
というカラムを定義しておいて、アプリ側では :admin
や :guest
などの名前で扱えるようになります。
✅ 基本の使い方
$ rails g model User name:string role:integer
$ rails db:migrate
# app/models/user.rb
class User < ApplicationRecord
enum role: { general: 0, admin: 1, guest: 2 }
end
このように書くと、次のような便利なメソッドが自動的に使えるようになります。
user = User.new(role: :admin)
user.admin? # => true
user.role # => "admin"
user[:role] # => 1(DB上は整数で保存)
User.roles # => {"general"=>0, "admin"=>1, "guest"=>2}
User.admin # => adminユーザーの一覧を取得するスコープ
✅ よくある使い方
タスクの状態管理
class Task < ApplicationRecord
enum status: { todo: 0, doing: 1, done: 2 }
end
<%= task.status %> # => "todo"
<%= task.doing! %> # => ステータスをdoingに変更
<%= task.done? %> # => ステータスがdoneか確認
✅ enum のメリット
機能 | 説明 |
---|---|
🔢 整数で DB に保存される | 軽量でパフォーマンスが良い |
🔍 スコープが自動で作られる | 例:User.admin
|
✅ チェック用メソッドが使える | 例:user.admin?
|
📚 値が限定されている | 不正な値が入りづらい |
🚨 注意点
enum の順番変更は NG!
定義順がそのまま整数にマッピングされるため、途中で順番を入れ替えるとバグの原因になります。
# NG(後から順番変更すると危険)
enum role: { guest: 0, admin: 1, general: 2 }
# OK(必ず値を明示する)
enum role: { general: 0, admin: 1, guest: 2 }
✅ バリデーションと組み合わせる
validates :role, inclusion: { in: roles.keys }
🌏 I18n で日本語化する
# config/locales/ja.yml
ja:
activerecord:
attributes:
user:
role:
general: 一般
admin: 管理者
guest: ゲスト
<%= t("activerecord.attributes.user.role.#{user.role}") %>
✅ まとめ
-
enum
は状態や種類を管理するのに便利 - スコープやチェックメソッドが自動で使える
- 定義順の変更に注意!値を明示しよう
- I18n と組み合わせて表示もスマートに