enumを使ってみる

enumとは

ActiveRecordが提供する機能の一種で、列挙型のクラスのことです。

土台となるアプリケーションを作成する

$ rails new enum_test
$ rails g scaffold User name:string role:integer

マイグレーションファイルを修正する

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.integer :role, default: 0, null: false

      t.timestamps
    end
  end
end

$ bin/rails g migrate

modelにenumを定義する

class User < ApplicationRecord
  enum role: { normal: 0, staff: 1 }
end

今回はユーザーにnormalとstaffという2つの権限を設定できるようにします。

ユーザを登録する

$ bin/rails cでコンソールを立ち上げ、
enum定義したnormalとstaff権限を持つユーザーを1データずつ作成します。

$ User.create(name: 'ノーマルユーザーさん', role: 0)
$ User.create(name: 'スタッフユーザーさん', role: 1)
f:id:maru877:20170705202005p:plain
$ User.allでデータの中身を確認してみる f:id:maru877:20170705202709p:plain

enumのメソッドを使ってみる

先ほど作成したノーマルスタッフさんを取り出して、enumのメソッドを検証していきます。

# usersテーブルからノーマルユーザーさんを取り出します
user = User.find(1)

# ユーザーのロールを確認します。(1ではなく、定義したキー値が返却されます)
user.role
=> "normal"

# userがnormalであるかどうかを、真偽値で返却します。
user.normal?
=> true

# userがstaffであるかどうかを、真偽値で返却します。
user.staff?
=> false

# userをnormalからstaffへ変更します。
user.staff!
=> UPDATE "users" SET "role" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["role", 1], ["updated_at", "2017-07-05 11:32:34.172870"], ["id", 1]

# userがstaffに変更されているか確認します。
user.role
=> "staff"

f:id:maru877:20170705203315p:plain

このようにenumを使うことでデータ数を固定できたり、
コードの可読性を向上させることができます。