5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[基礎編]enumを使って可読性を向上

Last updated at Posted at 2018-08-01

目的

  • enumの基本的な使い方を知識の整理のため

目次

  • enumをなぜ設定するのか?
  • enumの定義方法
  • scopeでのenumの使い方

enumをなぜ設定するのか?

Image from Gyazo

上記画像の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

最後に

文章力なさすぎて文章でアウトプットするの難しい。
定期的に過去の記事を見ると他者目線で見れる&メンテナンスにもなると思うので良いかも

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?