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
を使用せずにデータ取得が可能になる点については実装する時に時間短縮になるかなと思います。