4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RailsのEnumについて便利な使い方を知ったのでメモ

Last updated at Posted at 2023-08-30

enumの基本的な使用方法

enumとは、「名前と対応する数値を紐づけて管理するもの」だと捉えています。
使用方法は、app/models/users.rbとかのファイルに以下のように定義するだけ。

例1

  enum user_type: {
    admin: 1,
    nomal: 2,
    developer: 3
  }

例2

  enum month: {
    january: 1, # 1月
    february: 2, # 2月
    march: 3,  # 3月
    april: 4,  # 4月
    may: 5, # 5月
    june: 6,  # 6月
    july: 7,  # 7月
    august: 8, # 8月
    september: 9, # 9月
    october: 10, # 10月
    november: 11, # 11月
    december: 12  # 12月
  }

この時、user_typeカラムやmonthカラムにはinteger型を指定してテーブルを作成しましょう。

ただ、このままではenumの恩恵は十分に受けられていませんね。。。

便利な使い方

自分が便利だと思っただけで、他の開発者の方々にとっては普通なのかもしれません。

該当データを取得できる

以下のユーザーが登録されていると仮定します。

[#<User id: 1, username: "testuser01", name: "テストユーザー01", user_type: "admin">,
 #<User id: 2, username: "testuser02", name: "テストユーザー02", user_type: "developer">,
 #<User id: 3, username: "testuser03", name: "テストユーザー03", user_type: "normal">,
 #<User id: 4, username: "testuser04", name: "テストユーザー04", user_type: "developer">,
 #<User id: 5, username: "testuser05", name: "テストユーザー05", user_type: "admin">,
]

ユーザーテーブルからdeveloperのみを取り出したいときは、どのようにしますか?
よくやってしまうのは、以下のようにwhereを使用した書き方でしょうか?

User.where(user_type: "developer")

enumを使用していなければwhereでも良いですが、enumを使用すると以下のように書くことができます。

# ユーザーテーブルから開発者ユーザーだけを取得
p User.developer

#=>
[#<User id: 2, username: "testuser02", name: "テストユーザー02", user_type: "developer">,
 #<User id: 4, username: "testuser04", name: "テストユーザー04", user_type: "developer">]


# ユーザーテーブルから管理者ユーザーだけを取得
p User.admin

#=>
[#<User id: 1, username: "testuser01", name: "テストユーザー01", user_type: "admin">,
 #<User id: 5, username: "testuser05", name: "テストユーザー05", user_type: "admin">]

true or falseで値を返せる

ユーザーのタイプによって条件分岐させたい場合にも使えます。

# 以下のユーザーが登録されていると仮定します。
#<User id: 1, created_at: "2023-08-25 15:00:00.000000000 +0900", updated_at: "2023-08-25 15:00:00.000000000 +0900", username: "testuser01", name: "テストユーザー01", user_type: "admin">

p User.find(1).admin?        #=> true
p User.find(1).normal?       #=> false

# deviseを導入している場合には、、、
p current_user.admin?        #=> true

まとめ

enumを定義することで、冗長な表現を簡単に書くことができるようになりそうです。

個人的にはwhereを使用せずにデータ取得が可能になる点については実装する時に時間短縮になるかなと思います。

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?