CodeBox CodeBox

【Rails】enumまとめ

Ruby / Rails
けい

概要

『enum』は1つのカラムに複数の値を保存できるようにするものです。今回は、Customerモデルに複数の職業を持たせるようにしてみたいと思います。

準備編

1.migrationファイルを編集

Customerテーブルにocupationカラムを作成します。defaultが0になっていますが、次の章で設定します。

class CreateCustomers < ActiveRecord::Migration[6.0]
  def change
    create_table :customers do |t|
      t.string :name
      t.integer :age
      t.integer :ocupation, null: false, default: 0
      t.timestamps
    end
  end
end


2.モデルにenumの設定を記載

次にenumの設定をモデルに記載します。書き方はハッシュ or 配列で書くことができます。

# customer.rb
class Customer < ApplicationRecord
    # 書き方①
    enum ocupation: {employee: 0, self_employed: 1, part_time: 2, manager: 3, others: 4}
    # 書き方②
    enum ocupation: ["employee", "self_employed", "part_time", "manager", "others"]
end


enumの設定を確認

rails cでコンソールを開き、ダミーデータを作成します。

# 書き方① enumのバリューを代入
> Customer.create({name: "SAMPLE", age: 28, ocupation: 4, orders_attributes: [{customer_i
d: nil, item: "サンプル商品", quantity: 777}]})

# 書き方② enumのキーを代入
> Customer.create({name: "SAMPLE", age: 28, ocupation: 'others', orders_attributes: [{customer_i
d: nil, item: "サンプル商品", quantity: 777}]})


下記のようにデータが作成されます。

id:	13
name:	"SAMPLE"
age:	28
ocupation:	"others"
created_at	"2021-12-25T04:45:41.215Z"
updated_at	"2021-12-25T04:45:41.215Z"


DBも確認しましょう。今回はpostgreSQLを使用しています。

# DB一覧を表示
app_development=# \d
 Schema |         Name         |   Type   |  Owner   
--------+----------------------+----------+----------
 public | ar_internal_metadata | table    | postgres
 public | customers            | table    | postgres
 public | customers_id_seq     | sequence | postgres
 public | schema_migrations    | table    | postgres

# DBの中身を確認
app_development=# select * from customers;
 id |   name    | age | ocupation |         created_at         |         updated_at         
----+-----------+-----+-----------+----------------------------+----------------------------
 13 | SAMPLE    |  28 |         4 | 2021-12-25 04:45:41.215135 | 2021-12-25 04:45:41.215135


DBにはenumのバリューが保存されていることが分かります。

補足(enumのメソッド)

1.モデル名.enumのバリュー

enumのバリューに該当するデータを取得できます。

> Customer.others

# 実行結果
[#<Customer:0x00007ff59a8c67b0
  id: 13,
  name: "SAMPLE",
  age: 28,
  ocupation: "others",
  created_at: Sat, 25 Dec 2021 04:45:41 UTC +00:00,
  updated_at: Sat, 25 Dec 2021 04:45:41 UTC +00:00>]


2.インスタンス.enumのバリュー?

インスタンスがenumのバリューを持っているか確認できます。結果はBooleanです。

> customer = Customer.first
# 実行結果
=> #<Customer:0x00007ff599b3e458
 id: 1,
 name: "EUUUSMTM",
 age: 50,
 ocupation: "employee",
 created_at: Sat, 25 Dec 2021 04:18:24 UTC +00:00,
 updated_at: Sat, 25 Dec 2021 04:18:24 UTC +00:00>

> customer.employee?
=> true


解説は以上です!

ABOUT ME

けい
ベンチャーのフロントエンジニア。 主にVueとTypescriptを使っています。ライターのための文字数カウントアプリ:https://easy-count.vercel.app/