LoginSignup
0
0

More than 1 year has passed since last update.

ActiveRecord::Enum

Posted at

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}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0