0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsでpostgresqlのenumを使いたい

Last updated at Posted at 2021-12-12

この記事でわかること

  • Ruby on RailsでDBをpostgresql利用で開発する際に、PostgreSQLのEnumを利用する方法
    • 結論からいうとgem 'activerecord-postgres_enum'を利用します。

まえおき

  • Ruby on RailsでEnumを扱おうと思ったときに一番に思いつくのはActiveRecord::Enumです。
  • このActiveRecord::EnumはActiveRecordがDBにINSERT or DELETEする際に、定義したEnumの文字列から整数値に変換して保存させるといった使い方が一番使われると思います
  • ただ、DBで実際のデータを見たときに、1とか2が入っていてActiveRecordを介さないと一体何を表しているのかわからないので、PostgreSQLのEnumの機能を利用してデータの見やすさ改善を行っていきます。

手順

手順は簡単、まずはgemを入れましょう\(^o^)/
社員テーブルの性別と血液型の項目にEnumを利用してみます。

テーブル作成

  1. Gemfileにgem 'activerecord-postgres_enum'を追加する

    Gemfile.rb
    # その他の部分は省略
    gem 'activerecord-postgres_enum'
    
    
  2. 例の如くbundle install実行してください

  3. migrationファイルを作成していきます

    • create_enumがポイント
    20211212174036_create_employees.rb
    class CreateEmployees < ActiveRecord::Migration[5.2]
      def change
        # 作成するenumを宣言
        create_enum :empooyee_gender, %w(male female other)
        create_enum :empooyee_blood_type, %w(a b o ab)
    
        create_table :employees do |t|
          t.string :name, null: false
          # 各カラムに上記で宣言したenumを指定する
          t.enum :gender, enum_name: :employee_gender
          t.enum :blood_type, enum_name: :employee_blood_type
          t.timestamps
        end
      end
    end
    
  4. bundle exec rails db:migrateでテーブルを作成しましょう

  5. gender, blood_typeにenumが適用されていることを確認します(下記はTablePlusを使って確認しています)

  • data_typeがcreate_enumで作成したenumの名前になっていることがわかります
    スクリーンショット 2021-12-13 2.56.32.png
  • 試しにデータも入れてみましょう
    • 下記のようにデータがぱっと見てわかりやすいですね。
      スクリーンショット 2021-12-13 2.59.33.png

ActiveRecordから、作成したenumを扱う

  • ModelにEnumを宣言します
  • 基本的にはいつもと同じですが、value値に対応する文字列を指定します
employee.rb
class Employee < ApplicationRecord
  enum gender: {
    male: 'male',
    female: 'female',
    other: 'other'
  }

  enum blood_type: {
    a: 'a',
    b: 'b',
    o: 'o',
    ab: 'ab'
  }
end
  • このようにすることで、いつものActiveRecord::Enumと同じ用に扱うことができます

お疲れさまでした。

あとがき

  • 個人的にはEnumを使うときは整数値を保存せずに、上記のように文字列でデータが保存されることでデータの見やすさが圧倒的に違うので、どんどん利用していきたいと思っています。
    • 整数として保存されると実装を追わないと何を示しているのかわからない
    • 特にAPIの開発をしていると辛い部分があります...
  • また、今回記事にした理由として、gemを使わずにenumを作成しようとした際に下記のデメリットが有りました
    • migrationファイルにSQLを直接書くことになり、せっかくrailsを使っているのに...という気分になる(w)
    • テーブル自体は作成できるが、schema.rbにスキーマが正しく追加されず下記のように省略されてしまう
schema.rb
# Could not dump table "employees" because of following StandardError
#   Unknown type 'employee_gender' for column 'gender'
  • こういった理由から今回はgem 'activerecord-postgres_enum'を採用しました。

なにかありましたらコメントいただければと思います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?