enumとは
modelでの設定方法:
class User < ApplicationRecord
enum status: { pending: 0, approved: 1, rejected: 2 }, _prefix: :state
end
この設定を行うことで、usersテーブルのstatusカラムに保存される整数値(0, 1, 2)に対して、それぞれpending、approved、rejectedという名前を割り当てることができます。データベース内の値が何を意味するのかが一目でわかりやすくなり、コードの可読性が向上させることができます。
また、prefixオプションを使用することで、同じモデル内に同名の属性が存在する場合でも名前の衝突を避けることができ、スコープやメソッドの名前が衝突することを避けることができます。また、コードの可読性も上げることが可能です。このため、基本的にはprefixを設定するべきだと思います。
enumを設定することで、使用できるようになる機能
scope
User.state_approved
このスコープを用いることで、statusがapprovedに設定されているユーザーのみを取得できます。
User.not_state_approved
また、statusがapprovedではないレコードを取得することもできます。
#よくないenumの設定例
class User < ApplicationRecord
enum status: { not_hoge: 0, hoge: 1 }
end
scopeの名前が衝突してしまう可能性があるので、enum設定時に、not_hogeというよなnotをつけた形での否定形の命名を行わないようにしましょう。
User.where(status: :approved)
enumを直接使用して、クエリを書くことも可能です。
値の設定と判定を行うメソッド
user = User.new
user.state_approved!
state_approved!メソッドを使用することで、Userインスタンスのstatusをapprovedに更新することができます。
user.update!(status: :approved)
と同様の挙動になります。
if user.state_approved?
#省略
end
userのstatusがapprovedであるかどうかを判定できます。
まとめ
〇enumの設定方法について
- 可読性と拡張性の観点からprefixを設定する
- not_hogeというような否定形の命名を行わない
〇enumを設定することで、下記の3つが自動生成される
・scope
・値の更新ができるmethod
・値の判定ができるmethod