Enumを活用すれば整数値に名前をつけられる

July 17, 2020

こんにちは、たわらです。

Enum について簡単に整理した記事です。

Enum って?

「列挙型」という意味だそうです。

Wikipedia によれば「列挙型(れっきょがた、enumerated type あるいは enumeration type)とは、コンピュータプログラミングにおいて、プログラマが選んだ各々の識別子(列挙子)をそのまま有限集合として持つ抽象データ型である」

ざっくり説明すれば、一連の整数値に対して複数の変数名をつけること、と言えます。

こんなふうに使う

ユーザーのサービスに対する権限を定義する必要があるとします。

class AddColmunToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :role, :integer, null: false, default: 0
  end
end

こんな感じで、User クラスにroleカラムを追加します。データ型はintegerです。default を 0 にしておきます。

次に User クラスに次のように記述します。

enum role: { general: 0, admin: 1 }

こうすることで、0と 1 にそれぞれ general と admin という名前を付与することができます。(言い方として、role カラムに enum 属性を宣言する、という言うのでしょうか。このあたりがわからないですね、、、)

便利メソッドが使えるから属性の確認が効率よくできる!

enum 属性を付与することで、ユーザーがどの権限かを簡単に確認することができます。

たとえば、管理者権限のユーザーでしか許可したくないプログラムがあるとします。

enum を定義していない場合は、このように書くことになります。

実行したい処理 if @user.role == 1

このコードのいまいちなところは、1 が何を示しているかわからないことになります。

このデメリットを enum は解消してくれます。enum 属性を宣言すると便利メソッドが使えるようになるのです。

実行したい処理 if @user.admin?

このコードは自然言語に近いかたちで理解ができます。管理者か? とユーザーオブジェクトに聞いている感じですね。admin であれば true、そうでなければ false を返すメソッドが使えるようになります。

他にも破壊的なメソッドなどあるので都度確認しましょう。

参考文献

https://api.rubyonrails.org/v5.2.3/classes/ActiveRecord/Enum.html

https://qiita.com/ozackiee/items/17b91e26fad58e147f2e