未分類

[Rails]enum定義のあれやこれ

 

今回はenum(列挙型)の使い方について見ていこうと思います。

enumとは

まず、そもそもenumとは?

って、思う方もいらっしゃると思いますので、簡単に説明します。

enumとは、ActiveRecordが提供する数値(もしくは文字列、真偽値)のカラムに対してプログラム上で扱える別名を与えるものです。

enumを使うための準備

今回は、ユーザーテーブルを作成し、roleカラムを作成して説明を行おうと思います。

enum定義を行う方法は、integer型で行う場合、stringで行う場合、boolean型で行う場合の3つがあります。

一般的によく使われるのがinteger型になります。

ですので、integer型で今回は説明をしていこうと思います。

まずはアプリケーションを作成しましょう!

今回使用するバージョンは

  • Ruby 2.6.5
  • Ruby on Rails 6.1.4.1

を使用します。

アプリケーションを作成して、ディレクトリをプロジェクトに移動します。

$ rails new enum_app

$ cd enum_app

 

enum定義をinteger(数値型)で行う場合

まずは、integer型で定義する場合です。

$ rails g model user name:string email:string role:integer

 

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

      t.timestamps
    end
    add_index :users, :email, unique: true
  end
end

 

上記のコードを見ていただければわかるように、モデルのバリデーションだけではなく、DB側にも制約をつけてやります。

まず、全てのカラムに対して、null: falseで空の状態で作成されないように設定します。

eamilカラムには、unique: trueとしてやることで、一意制約を付与しています。

roleカラムには、default: 0ということで、今回enumで定義した定数を何も指定しなかった場合に、0の値が入って保存されるよう設定しています。

それでは、マイグレーションを実行しましょう。

$ rails db:migrate

 

次の章では、実際にenumを定義して使ってみます。

enumの使い方

 

class User < ApplicationRecord

  # 省略

  enum role: {
    general: 0, author: 1,
    editor: 2, admin: 10
  }

end

 

今回はユーザーに、general(一般), author(著者), editor(編集者), admin(管理者)としてみました。

それぞれキーに呼び出したい定数を書いて、バリューにそれに対応させたい数値を記述します。

このように定義することで、コンソール上で呼び出すことができます。

$ rails c
irb(main):001:0> user = User.new(name: 'sample1', email: 'sample1@example.com', role: 0)
   (1.2ms)  SELECT sqlite_version(*)
=> #<IntUser id: nil, name: "sample1", email: "sample1@example.com", role: "general", created_at: nil, updated_at: nil>
irb(main):002:0> user.save
  TRANSACTION (0.1ms)  begin transaction
  User Exists? (0.8ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "sample1@example.com"], ["LIMIT", 1]]
  User Create (1.9ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["name", "sample1"], ["email", "sample1@example.com"], ["created_at", "2021-11-18 06:57:18.111615"], ["updated_at", "2021-11-18 06:57:18.111615"]]
  TRANSACTION (1.3ms)  commit transaction
=> true
irb(main):003:0> user
=> #<User id: 4, name: "sample1", email: "sample1@example.com", role: "general", created_at: "2021-11-18 06:57:18.111615000 +0000", updated_at: "2021-11-18 06:57:18.111615000 +0000">
irb(main):004:0> user.role
=> "general"

 

値を確認したいときはこのように確認します。

irb(main):004:0> user = a
=> #<IntUser id: 1, name: "sample1", email: "sample1@example.com", role: "general", created_at: "2021-12-06 00:46:18.782945000 +0000", updated_at: "2021-12-06 00:46:18.782945000 +0000">
irb(main):005:0> user.general?
=> true

また、値を変更したい時はこのようにすると変更することができます。

irb(main):004:0> user.admin!
  TRANSACTION (0.2ms)  begin transaction
  User Exists? (0.3ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = ? AND "users"."id" != ? LIMIT ?  [["email", "sample1@example.com"], ["id", 5], ["LIMIT", 1]]
  User Update (2.7ms)  UPDATE "users" SET "role" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["role", 10], ["updated_at", "2021-12-06 00:26:57.367025"], ["id", 5]]
  TRANSACTION (2.7ms)  commit transaction
=> true
irb(main):005:0> user
=> #<User id: 5, name: "sample1", email: "sample1@example.com", role: "admin", created_at: "2021-12-06 00:26:37.446213000 +0000", updated_at: "2021-12-06 00:26:57.367025000 +0000">

 

enumの値の末尾に「!」をつけると、そのenumの値を更新することができます。

また、enumで定義している値を確認したいときは、モデル名.enumのカラム名の複数形で参照することができます。

irb(main):006:0> User.roles
=> {"general"=>0, "author"=>1, "editor"=>2, "admin"=>10}

 

最後に

今回はRailsのenumの使い方について見てきました。

enumの実装はよく出てくるので、しっかり覚えていきましょう。

また、enumで定義した値を日本語で出力するenum_helpというライブラリもあるので、興味がある方は調べてみると良いかもしれません。

この記事が皆さんの日々の学習に役立つと幸いです。

それではまた、次回の記事でお会いしましょう!

ABOUT ME
YasuharaKenta
社会人3年目の年になります。2年間専門商社の営業として従事し、現在は都内でWebエンジニアとして働いています。 新人エンジニアとしてわからないことなどを、分かりやすくブログにまとめれるように頑張っていきます!!
株式会社Playgroundのサービス
  • 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
  • Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
  • 開発,DX推進支援サービス スタートアッププラン

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA