enum(列挙型)とは?
読み方は「イーナム」。
DBにんはint型やboolen型で保存をし、使うときに文字列として使うことができる型。
model上で数値と文字列を定義すると、数字と対応した文字列を取り出すことができる。
どういうときに使用するか?
あるインスタンス(@userや@item)において、その状態を管理したいとき。
たとえば、あるユーザーが入金前、入金確認中、入金完了など状態の変化をするとき。
入金前を0、入金前を1、入金前を2とすることで、表現することができる。
enum型を使用するメリットは?
- 数字として管理することで、 静的なオブジェクトとして扱うことができ、安全性を高めることができる。
- 状態を管理するとき、メソッドを使うことができる。
- 文字列が変わったとしても数字で管理しているので、改修が簡単になる。
デメリット
- mysql側から見ると数値で保存されてしまうため、マジックナンバーが増える
マジックナンバーとは?
0が未処理、1が処理中、2が処理済みだったとして、ある数字が意味を持つ(1は数字ではなく未処中という意味)
実際にコードを見る
model/item.rb
class Item < ApplicationRecord
enum l_category_id: [['---',""], ['レディース', 1], ['メンズ', 2],['ベビー・キッズ', 3]]
end
new.html.erb
= f.select :l_category_id, Item.l_category_ids.keys, {}, class: "select-default"
↓
コンパイルされたhtml
<select class="select-default" name="item[l_category_id]" id="item_l_category_id"><option>---</option>
<option value="レディース">レディース</option>
<option value="メンズ">メンズ</option>
<option value="ベビー・キッズ">ベビー・キッズ</option>
dbはint型としてカラムに保存する
class AddStatusToItems < ActiveRecord::Migration[5.0]
def change
add_column :items, :status, :integer, null:false
end
end