enumとは?
enum(enumeration: 列挙)は、名前を整数の定数に割り当てるのに使われるデータ型です。(列挙型というみたいです。)
名前は言語の定数として振る舞う識別子なので、整数を直に扱う場合よりもプログラムの読みやすさとメンテナンス性が向上します。
例::publicを0、:draftを1として、0や1で状態を定義できる
使い方
例として、article(記事)というモデルにstatus(状態)というカラムを作成し、それをenumを使って表します。
デフォルトで0(draft)になるように設定してます。
カラム作成
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles do |t|
# 他のカラムの定義
t.integer :status, default: 0
t.timestamps
end
end
end
modelでenumの設定
記事が、下書き中、公開、非公開といった感じで状態分けしてます。
class Article < ApplicationRecord
enum status: { draft: 0, public: 1, private: 2 }
end
ハッシュ以外にも配列で定義することも可能です。
使用例
# Articleを作成して保存する
article = Article.new(status: :draft)
article.save
# 作成したArticleの状態を確認する
article.status
=> "draft"
# 状態を変更して保存する
article.public!
article.save
# 状態が変更されたことを確認する
article.status
=> "public"
# 番号から状態を取得する
Article.statuses[0]
=> "draft"
Article.statuses[1]
=> "public"
Article.statuses[2]
=> "private"
日本語化することも可能
例えば、config/locales/ja.ymlというファイルを作成し、以下のように定義します。
ja:
enums:
article:
status:
draft: "下書き"
public: "公開"
private: "非公開"
このように定義することで、Articleモデルのstatus列に対して、draftが”下書き”、publicが”公開”、privateが”非公開”という日本語の表現が適用されます。
例えば、以下のようにビューファイルで設定し、@article_statusが:draftの場合、ビューで表示される内容は状態: 下書き
のようになります。
<p>
状態: <%= t("enums.article.status.#{ @article_status }") %>
</p>