enumとは
リソースの区分けや状態を示すのに利用されます。
例えばbookを投稿し、それをみんなで共有できるものがあるとします。
そして投稿されているbookの投稿者が、そのbookを公開・非公開設定できるものとします。
今回で言えば、bookというリソースの中で公開・非公開という状態区分けがあります。
enumを使うことでこのような機能を簡単に作ることができます。
enumの使い道
今回必要になる状態は、公開状態と非公開状態です。
その場合の設定手順は以下になります。
まず、bookテーブルにstatusカラムを追加します。
下のenumで定義していますが、投稿したらそのまま公開状態にしたいのでデフォルトを1にします。
#ターミナル
rails g migration AddStatusToBooks status:integer
#migrationファイル
def change
add_column :books, :status, :integer, default: 1, null: false, limit: 1
end
次にenumを追加します。
enum status:{nonreleased: 0, released: 1}
ここでは公開するという英語であるreleaseを使います。さらにedをつけることで状態を表します。
非公開状態を0とし、公開状態を1とします。
こうすることで様々なメソッドがつけるようになります。
そのメソッドの種類についてはこちらの記事が非常に参考になります。
そして、最後に公開・非公開ボタンを押せばそのbookの状態を変えられるようにします。
def release
book = Book.find(params[:id])
book.released! unless book.released?
redirect_to edit_book_path(book), notice: 'この作品を公開しました'
end
def nonrelease
book = Book.find(params[:id])
book.nonreleased! unless book.nonreleased?
redirect_to edit_book_path(book), notice: 'この作品を非公開にしました'
end
<% if @book.released? %>
<%= link_to '非公開にする', nonrelease_book_path(@book), method: :patch %>
<% else %>
<%= link_to '公開する', release_book_path(@book), method: :patch %>
<% end %>
公開非公開機能の完成です。
enumのメリット
1.便利なメソッドを自動生成してくれる。
上の記事を見ていただければいいのですが、便利なメソッドがたくさん作り出されます。
インスタンスにreleased!とかをつけるだけでカラムを変更できたり、released?をつければtrueやfalseを返してくれます。簡単にカラムの値を調べたり、変更できたりできるのは非常にやりやすいです。
2.マジックナンバーを使わなくて済む。
どちらかというと、こちらの方が自分的には大きな理由ですが、マジックナンバーを使わなくて済みます。
マジックナンバーはプログラムを書いた人にしかわからない数字のことです。
上のedit.html.erbにある、if @book.released?もif @book.status == 1と無理矢理書くこともできますが、1ってなんやねん!?となりますよね。でもreleased?と書かれていれば感覚的に意味がわかります。他の人たちと共有して仕事するときに可読性を上げられます。