Just do IT

思うは招く

Rails + PostgreSQL で id を uuid に変更したい

モデル作成時に設定する手順

$ rails new uuid-test -d postgresql
$ cd uuid-test

データベース作成。

$ rails db:create

モデル作成。

$ rails g model User name:string

マイグレーションファイルを修正。

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    #追記
    enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
    create_table :users, id: :uuid, default: 'gen_random_uuid()' do |t|
      t.string :name

      t.timestamps
    end
  end
end
  • enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')を追加
  • id: :uuid, default: 'gen_random_uuid()'を追加

ここはRailsガイドを参照した。

$ rails db:migrate

マイグレーション後、コンソールで確認する。

$ rails c

> name = User.create(name:"hoge")
> name.id
=> "8fad7bd5-b775-48fe-8249-023319be36b5"

id が uuid になった。

失敗

$ rails db:migrate

をしたところ、以下のエラー。

rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "uuid_test_development" does not exist

ただ単にDBを作っていなかった😅

$ rails db:create

エラーメッセージはよく読もう。

uuid を外部キーとして参照する場合

type: :uuidと明示的に指定しなければならない点に注意する。

# db/migrate/20150418012400_create_blog.rb
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
create_table :posts, id: :uuid, default: 'gen_random_uuid()'

create_table :comments, id: :uuid, default: 'gen_random_uuid()' do |t|
  # t.belongs_to :post, type: :uuid
  t.references :post, type: :uuid
end

引用:https://railsguides.jp/active_record_postgresql.html#uuid

感想

開発の途中から id を uuid に変える場合、調べたらかなり面倒ぽいので、実装が浅ければテーブルを削除してモデルを作り直したほうが早いかも知れない。

参考