LoginSignup
6
7

More than 3 years have passed since last update.

Rails - enumの使い方

Last updated at Posted at 2021-03-28

はじめに

プログラミングスクールでチーム開発を行った際に、初めてenumを使いました。

忘れないようアウトプットしていこうと思います。

誤りがあれば、ご指摘いただけると幸いです。

enumとは

日本語訳は、「列挙型
列挙:一つ一つ数え立てて挙げること。並べ立てること。

integer型のカラムに対して、
数値ごとに対応する任意の名前をつけることができます。



ーーーーーーーーーーーーーーーーーーーー
Ex)
ECサイトで支払い方法を保存するカラム
カラム名:payment
データ型:integer

数値 1のとき : クレジットカード という名前として扱う
数値 2のとき : 銀行振り込み という名前として扱う
数値 3のとき : 代引き という名前として扱う

このように、
保存されている数値に応じて、名前を自由に変えることができます。

ーーーーーーーーーーーーーーーーーーーー

使い道

基本的には、カラムで用いる値が複数個に固定されているときがおすすめです。

ーーーーーーーーーーーーーーーーーーーー
Ex)
有効 or 無効
○ or △ or ×
販売中 or 売切れ中 or 残りわずか
クレジットカード or 銀行振り込み or 代引き
ーーーーーーーーーーーーーーーーーーーー

色々な記事を見ましたが、
頻繁に更新が発生したり、複数モデルで利用する場合は
修正が大変になる可能性がある為、好ましくないようです。

書き方

1 : integer型のカラムを定義します。

ターミナル.
rails g migrate create_orders

マイグレーションファイルを作成します。

20210316134657_create_orders.rb
class CreateOrders < ActiveRecord::Migration[5.2]
  def change
    create_table :orders do |t|
      t.timestamps
      t.integer :member_id
      t.integer :postage, null: false
      t.string :postal_code, null: false
      t.string :address, null: false
      t.string :name, null: false
      t.integer :payment, null: false, default:0
      t.integer :total_price, null: false
      t.integer :order_status, null: false, default:0
    end
  end
end


必要なカラムを定義します。
ここでは、order_statusenumを使おうと思い、integer型で定義しています。

ターミナル.
rails db:migrate

マイグレーションファイルの反映もお忘れなく。

2 : enumを定義します

enumの定義はモデル内で行います。

order.rb
enum order_status: {
  入金待ち: 0,
  入金確認: 1,
  製作中: 2,
  発送準備中: 3,
  発送済み: 4}
}

対応するモデルに
enum カラム名: {名前1: 数値1, 名前2: 数値2 }のように書けば定義完了。

これで、order_statusに0~4の値が入った時、
その値ごとに命名した名前を使うことができます。

使用事例

rails cを使って見てみましょう。

事前に登録しておいて注文( id : 1 )を見てみましょう!

ターミナル.
2.6.3 :001 > order = Order.find(1)
  Order Load (0.2ms)  SELECT  "orders".* FROM "orders" WHERE "orders"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
 => #<Order id: 1, created_at: "2021-03-28 03:05:09", updated_at: "2021-03-28 03:05:09", member_id: 1, postage: 800, postal_code: "1974905", address: "東京都品川区上大崎2-15-22", name: "てすと太郎", payment: "0", total_price: 3660, order_status: "入金待ち"> 

長い出力結果になってしまい、見づらいかもしれませんが、
出力結果の1番最後にorder_status:"入金待ち"となっているのがわかると思います。

これは、
order_statusの初期値が0 (default : 0)
0の時、"入金待ち"となるようenumで定義 (入金待ち : 0)
この2つが作用しての結果になっています。

では、このorderのorder_statusを更新してみましょう。

先ほどOrder.find(1)は変数orderに代入しています。
そのままorderを使ってupdateしてみます。

ターミナル.
2.6.3 :002 > order.update(order_status: 1)
   (0.3ms)  begin transaction
  Member Load (0.1ms)  SELECT  "members".* FROM "members" WHERE "members"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Order Update (4.2ms)  UPDATE "orders" SET "updated_at" = ?, "order_status" = ? WHERE "orders"."id" = ?  [["updated_at", "2021-03-28 03:13:44.190705"], ["order_status", 1], ["id", 1]]
   (4.5ms)  commit transaction
 => true 


2.6.3 :003 > order
 => #<Order id: 1, created_at: "2021-03-28 03:05:09", updated_at: "2021-03-28 03:13:44", member_id: 1, postage: 800, postal_code: "1974905", address: "東京都品川区上大崎2-15-22", name: "てすと太郎", payment: "0", total_price: 3660, order_status: "入金確認"> 

こちらも長くて見づらいですが、
出力結果の1番最後にorder_status:"入金確認"と値が更新されているのがわかります。

order_statusを 1 に更新したことで、
enumを参照し、命名した名前に値を更新できました。

さいごに

今回書いたenumの使い方は、基本中の基本になります。

チーム開発では、
・if文内での条件分岐enumを使う
・form_with内のselectでenumを使う
・enumを使ったカラムの変更を参照して他enumの値を連動して変更する
など様々な機能を実装しました。

まだまだ未熟者ですが、
少しでも誰かの参考になれば幸いです。


もっと詳しく知りたい方はこちら

私がenum初めましての時にとても参考にさせていただきました。
私もこれらのようにわかりやすく、詳しく書けるようになりたい。

【Rails】Enumってどんな子?使えるの?

【Rails】 enumとは? enumを用いてselectボックスを作ってみた

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7