目的
- enumの基本的な使い方を知識の整理のため
目次
- enumをなぜ設定するのか?
- enumの定義方法
- scopeでのenumの使い方
enumをなぜ設定するのか?
上記画像のstate
カラムの値(数字)がぱっと見で何をやっているのか分からないですよね。
そのような場合に、使用すると便利なのが「enum」です。
enumは値に意味を持たせることができます。
「0、1、2」という便宜的な数値で操作するよりも、よりも、「draft、published、deleted」のようなキーワードで操作/参照できた方がコードの可読性は改善します。
enumの定義方法
定義するキーワード |
---|
値 | 意味 |
---|---|
0 | 下書き(draft) |
1 | 公開済み(published) |
2 | 削除済み(deleted) |
enumを定義
class Article < ApplicationRecord
# 0が「draft」、1が「published」、2が「deleted」で操作/参照できるようになる
enum state: { draft: 0, published: 1, deleted: 2 }
end
操作/参照方法
def show
# 仮定
# id:1の記事をのデータを検索
@article = Article.find(1)
# @articleにはid:1のデータ入っている
# @articleに対して破壊的メソッド「.published!」で「公開済み(published)」に更新し保存する
@article.published!
# @article.stateを表示する(ステータス:公開済み)
render plain: 'ステータス:' + @article.state #結果: published
end
列挙値は配列としても定義できる
enum state: [:draft, :published, :deleted]
この場合、データベースには配列のインデックス値がセットされます。
ただし、その性質上、自分で数値を設定できない、あとから列挙値を追加/削除した場合、既存の値がずれる可能性がでてきます。
scopeでのenumの使い方
class Article < ApplicationRecord
scope :viewable, -> { published.where('published_at < ?', Time.current) }
# enumで設定した「published」を記述することで簡単に条件定義できる
end
最後に
文章力なさすぎて文章でアウトプットするの難しい。
定期的に過去の記事を見ると他者目線で見れる&メンテナンスにもなると思うので良いかも