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?

enumを設定することで使用できるscope・メソッド

Last updated at Posted at 2024-04-20

enumとは

modelでの設定方法:

user.rb
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.rb
User.state_approved

このスコープを用いることで、statusがapprovedに設定されているユーザーのみを取得できます。

user.rb
User.not_state_approved

また、statusがapprovedではないレコードを取得することもできます。

user.rb
#よくないenumの設定例
class User < ApplicationRecord
    enum status: { not_hoge: 0, hoge: 1 }
end

scopeの名前が衝突してしまう可能性があるので、enum設定時に、not_hogeというよなnotをつけた形での否定形の命名を行わないようにしましょう。

user.rb
User.where(status: :approved)

enumを直接使用して、クエリを書くことも可能です。

値の設定と判定を行うメソッド

user.rb
user = User.new
user.state_approved!

state_approved!メソッドを使用することで、Userインスタンスのstatusをapprovedに更新することができます。

user.update!(status: :approved)

と同様の挙動になります。

user.rb
if user.state_approved?
    #省略
end

userのstatusがapprovedであるかどうかを判定できます。

まとめ

〇enumの設定方法について
- 可読性と拡張性の観点からprefixを設定する
- not_hogeというような否定形の命名を行わない
〇enumを設定することで、下記の3つが自動生成される
・scope
・値の更新ができるmethod
・値の判定ができるmethod

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?