概要
『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
解説は以上です!