ActiveRecord::Enumとは?
ActiveRecord::Enumとは列挙型、あるいはenum型と呼ばれるものでActiveRecordが提供するenum型は数字のカラムに対してプログラム上で扱える別名を与えるもの。
ActiveRecord::Enumを使う
例えば、あるモデルにそのモデルの状態(ステータス)を扱うカラムがあるとする。そのようなカラムがあった時にenumを利用するとカラムの値を数字として管理することができる。
class Task < ApplicationRecord
enum status: { # statusと言うカラムの値をenumを使って表現する
private: 0,
draft: 1,
published: 2,
}
end
このようにすると、statusカラムの値を数字として扱うことができるようになる。
(文字列としても、シンボルとしても指定することができるようになる)
enumで定義されたカラムの値を確認する
enumを利用すると、データを参照するときにも利点がある
ステータスの状態を確認するメソッドが提供される
一つ目の利点は、モデルのインスタンスに対してそのステータスの状態を確認するためのメソッドが提供されること。
task = Task.first
task.published? # taskが公開済みかどうかを検証している
=> true
enumを利用したscopeを使えるようになる
二つ目の利点は、enumで定義した値を利用したscopeを利用できるようになること。
tasks = Task.draft # statusがdraftとなっているtaskを抽出できるようになる(where(status: 'draft')と同じこと)
enumの値を簡単に書き換える
enumの値を書き換えるときは、
task = Task.first
task.published!
とする(末尾に’!’をつける)ことでそのインスタンスの値を書き換える(DBの値も更新する)ことができる。
その他のメソッド
DBに保存されている実際の値を確認する
’before_type_cast’で実際の値を確認することができる。
task = task.first
task.status_before_type_cast
=> 2 # 今回の場合、publishedのであれば2と表示される
enumで定義されている値を確認する
enumで定義したカラム名を複数形で呼び出すと定義されている値全てを確認することができる。
Task.statuses
=> {"private"=>0, "draft"=>1, "published"=>2}