今回は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というライブラリもあるので、興味がある方は調べてみると良いかもしれません。
この記事が皆さんの日々の学習に役立つと幸いです。
それではまた、次回の記事でお会いしましょう!
- 無料・簡単・片手でホームページを作成できる自社サービス Rakwi
- Web制作とアプリ開発を学べるオンラインプログラミング講座 Upstairs
- 開発,DX推進支援サービス スタートアッププラン