🎉

【Rails】enumの設定

2023/10/24に公開

ECサイトで製作ステータス作成の際に使用したenumについて復習します。

enumとは

enum とは、数値に意味を持たせることができるもので、こんかい今回は製作ステータスになるため下記のようなイメージになります。

  • 着手不可 → 0
  • 製作不可 → 1
  • 製作中  → 2
  • 製作完了 → 3

enumのメリットとは?

上記のような数値管理をすることで次のようなメリットがあります。

  • 決められた数値以外の登録が出来ないようにすることで安全性が高まる
  • 上記の支払い方法のような、支払い方法の選択用のテーブルを作成する必要がなくなる
  • データベースに格納する時に、数値型の方がデータサイズが小さくなる

enum実装手順

enum_helpを導入

「enum_help」というGemを使用することで簡単にViewで扱うことができます。
Gemfileの一番下に下記を記述

Gemfile
:
  gem "enum_help"

enumを定義する

ここでは、数値と文字列をモデルにて紐づけし、呼び出せるようにします。

order_detail.rb
class OrderDetail < ApplicationRecord
  belongs_to :order
  belongs_to :item
  
  enum making_status: { making_unable: 0, waiting_for_making: 1, in_making: 2, making_completed: 3 }
  
end

そのため、表示する際には日本語化させることが必要になります。

日本語化するための手順

Rails アプリケーションを日本語対応させるには、国際化(i18n)という仕組みを使って行います。

config/application.rb に追記を行う

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

上記記述によりRailsアプリケーションのデフォルトの言語が日本語となり次の手順で作成する ymlファイルをもとに日本語化を行うといった流れとなります。

yml ファイルを作成する

config/localesフォルダにja.ymlというファイルを作成し、このファイルに次のように記述します。

config/locales/ja.yml
ja:
  enums:
    order_detail:
      making_status:
        making_unable: "着手不可"
        waiting_for_making: "製作不可"
        in_making: "製作中"
        making_completed: "製作完了"

上記の記載によりenumを使用するまでの設定は終わります。
ちなみに上記の書き方はこちらに当てはめたものになります。

ja.yml
ja: # 日本語の設定を行う
    enums: # enumの設定を行う
      [モデル名]:
        [カラム名]:
          [enumで番号と紐付けた要素]
          [enumで番号と紐付けた要素]:# 要素の数だけ追加する

使用例

製作ステータスに使用した場合の例となります。

<div>
<%= form_with model: order_detail, url:admin_order_detail_path(order_detail.id), method: :patch do |f| %>
  <%= f.select :making_status, [
      [OrderDetail.making_statuses_i18n[:making_unable], :making_unable],
      [OrderDetail.making_statuses_i18n[:waiting_for_making], :waiting_for_making],
      [OrderDetail.making_statuses_i18n[:in_making], :in_making],
      [OrderDetail.making_statuses_i18n[:making_completed], :making_completed]
  ] %>
  <%= f.submit '更新', class:"btn btn-success btn-sm mx-3" %>
<% end %>
</div>

上記のようにmaking_statusesというカラム名の後ろに_i18nとつけることによって日本語で表示させることができます。

ECサイトでは他にも支払い方法や注文ステータスなどenumを使用するところがでてくるのでモデルやymlファイルの記述などは上記の書き方を参考に書くとできるはずです。

Discussion