💭

enumの導入およびステータス管理方法

2023/07/24に公開

enum 実装手順
今回 EC サイトを実装するにあたって、注文入力画面の支払い方法の選択など複数箇所で enum というものを使用します。
enum とは、数値に意味を持たせることができるもので、例えば以下のように管理することができます。

0 → クレジットカード
1 → 銀行振り込み
このように数値で管理することによって、次のようなメリットがあります。
決められた数値以外の登録が出来ないようにすることで安全性が高まる
上記の支払い方法のような、支払い方法の選択用のテーブルを作成する必要がなくなる
データベースに格納する時に、数値型の方がデータサイズが小さくなる

#手順#

  1. 数値と文字列を紐付ける
  2. 文字列を日本語化する
  3. View などで表示を行う

enum_help の導入

Gemfile
  :
  :
  gem "enum_help"

記述後、ターミナルで"bundle install"

enum を定義する
モデルにenumを記述

order.rb//order_item.rb
# 注文ステータス(0=入金待ち / 1=入金確認 / 2=制作中 / 3=発送準備中/ 4=発送済み)
 enum order_status: {
    "入金待ち": 0,
    "入金確認": 1,
    "制作中": 2,
    "発送準備中": 3,
    "発送済み": 4
}

# 制作ステータス(0=着手不可 / 1=制作待ち / 2=制作中 / 3=制作完了)
enum order_status: {
    "着手不可": 0,
    "制作待ち": 1,
    "制作中": 2,
    "制作完了": 3
}

番号が0から始まっている点に注意です。
表示したい内容とそれに合わせて数字を順に並べていきます。

#モデルに定義したものを出力する方法
ターミナルで"rails c"を実行する

rails c
3.1.2 :001 > Order.order_status

日本語化する方法

config/application.rb
module NaganoCake
  class Application < Rails::Application  
  :
  config.i18n.default_locale = :ja  :
  :
  end
end

#ymlファイルを作成

config/locales/ja.yml
ja:
  enums:
    order:
      order_status:
        waiting: "入金待ち"
        paid_up: "入金確認"
        producting: "製作中"
        preparing: "発送準備中"
        sented: "発送済み"
    order_item:
      production_status:
        impossible: "着手不可"
        waiting: "製作待ち"
        production: "製作中"
        complete: "製作完了"
書き方
 ja: # 日本語の設定を行う
    enums: # enumの設定を行う
      [モデル名]:
        [カラム名]:
          [enumで番号と紐付けた要素]
          [enumで番号と紐付けた要素]:# 要素の数だけ追加する

viewでの表示方法

orders/show.html.erb
#注文ステータス
<%= form_with(model: @order, url: admin_order_path(@order.id), local: true, class: "form-row") do |f| %>
                    <%= f.select :order_status, Order.order_statuses_i18n.invert, class: "order_status", class:"form-control form-control-sm col-6"  %>
                    <%= f.submit "更新" , class: "btn btn-success" %>
                 <% end %>

#制作ステータス
<%= form_with(model: order_item, url: admin_order_item_path(order_item.id), method: :patch, local: true, class: "form-row") do |f| %>
                    <%= f.select :production_status, OrderItem.production_statuses_i18n.invert, class: "production_status", class:"form-control form-control-sm col-6" %>
                    <%= f.submit "更新" , class: "btn btn-success" %>
                <% end %>

@order = Order.find(params[:id])とControllerに定義しています。また、ストロングぱらめーたーにも、permitでorder_statusを入力しています。

補足
日本語で呼び出すには"_i18n"をつける

Discussion