Edited at

【Rails】enumとは?メリット、使い方、カラムの追加方法について


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