RailsでMySQLを使う時にuuidにデフォルト値を入れたい

こんにちは!kossyです!




さて、今回はRailsMySQLを使う時にuuidにデフォルト値を入れる方法についてブログに残してみたいと思います。



環境

Ruby 2.6.6
Rails 6.0.3
MySQL 5.7系



moduleの作成

PostgreSQLの場合だとuuid型のカラムが存在しているのですが、MySQLの場合はありません。

# PostgreSQLの場合だとt.uuidでuuid型のカラムが用意されていて、uuid_generate_v4()関数でデフォルト値を設定できる

t.uuid :uuid, null: false, default: 'uuid_generate_v4()'

このため、独自でuuidを自動挿入する仕組みを整える必要があります。

コードを晒すと以下のような実装になります。

# uuid生成のモジュール
# このモジュールをuuidを自動挿入したいモデルにincludeする

module UuidGenerator
  extend ActiveSupport::Concern

  def self.included(klass)
    klass.before_create :fill_uuid
  end

  def fill_uuid
    self.uuid = loop do
      uuid = SecureRandom.uuid
      break uuid unless self.class.exists?(id: uuid)
    end
  end
end
class CreateAdmins < ActiveRecord::Migration[6.0]
  def change
    create_table :admins do |t|
      t.string :uuid, null: false, index: true, unique: true

      t.timestamps
    end
  end
end
class Admin < ActiveRecord::Base
  include UuidGenerator
end

これでレコードが作成される前にuuidが挿入されるようになります。




勉強になりました。