🐙

[Rails]enumについて

2023/02/19に公開

enumとは (概論)

語源は enumeration(列挙)で、
名前を整数の定数に割り当てるために使われるデータ型の一つ。
1つのカラムに、指定した複数個の定数を保存できる様になる。
migration fileに記述するときのデータ型は、integer型で、
     defaultの設定を必ずしましょう。

数値で管理することのメリット

  • 安全性が高まる(正当性が保証される)
    (きめられた数値以外の登録が出来ないようになるから)
  • データベースに格納する時に、数値型の方がデータサイズが小さくなる
    (DBの負担が減る)
  • コードの可読性向上
  • データの変更が容易になる
    データの変更などあった際に、enumを使用してることにより、データベースのスキーマやコードの修正が不要で、
    enumの定義だけ変えれば済むようになる。

enumを日本語化させ実装するには: i18nとYAMLfile

enumで定義された属性の値を、日本語で表示するためには、少し設定が必要。

ActiveRecord::Enum の仕組みで簡単に実装自体はできるのだが、
直接数値と日本語を紐づけると、一部使えなくなるメソッドが存在する。 
=> i18nを使用する。

● i18n(internationalization)とは

多言語対応を可能にするためのライブラリ。
アプリケーション内のテキストやメッセージを翻訳可能な形式で記述し、
翻訳用のデータベースを管理することにより実現している。
= YAML(ヤムル)ファイルの記述を行うよ!

● YAML(ヤムル)ファイルとは

テキストファイルの一種で、人間が読みやすく、コンピュータが処理しやすいデータの構造化フォーマット
主に設定ファイルやデータファイルとして使用される。
今回はi18nライブラリを使用していくため、各言語の翻訳データをYAML形式で記述していく。

実装方法

1. gem導入 :enum_help

  • enum_help :Railsのenum機能をより使いやすくするためのGem
gem "enum_help"

bundle install行う。

2. enumの定義 :modelに記述

今回は例として、orderモデルのpayment_method(支払い方法)カラムに
enum使用していく.設定内容は、

  • 0 が入っている場合は credit_card(クレジットカード)
  • 1 が入ってる場合は transfer(銀行振込)
    これに沿って実装していきます。

<order.rb>

 enum payment_method: { credit_card: 0, transfer: 1 }
  • ここの段階では、英語表記です。(日本語では書きません。)
  • ここでの記述の型は、以下に示します。
class モデル名 < ApplicationRecord
  enum 属性名: {1:1の番号,2:2の番号, ... }
end

3. 日本語対応していく

①config/application.rb に日本語化対応の追記

  • 以下のように、config.i18n.default_locale = :jaの記述を行う。
  • これでRailsのデフォルトの言語が日本語になる。
:
module NaganoCake
class Application < Rails::Application
 :
 :
  config.i18n.default_locale = :ja #ここ!
 :
  end
end

②ymlファイルを作成

  • 上記でも書いたが、作成しここに、翻訳データをYAML形式で記述していく。
  • 日本語対応にするため、今回は, config/locales フォルダに ja.yml というファイルを作成.

<記述の基本型>

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

では今回の例の内容も、この型に当てはめて作成すると以下のようになる。

ja: # 日本語の設定を行う
    enums: # enumの設定を行う
      order: # モデル名(Orderモデルに対して)
        payment_method: # カラム名(payment_methodカラムに対して)
          credit_card: "クレジットカード"
          transfer: "銀行振込"

最後はできているか、ターミナルでRails cで見てみよう😀

Discussion