0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している 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 と組み合わせて表示もスマートに
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?