モデル作成時に設定する手順
$ 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 に変える場合、調べたらかなり面倒ぽいので、実装が浅ければテーブルを削除してモデルを作り直したほうが早いかも知れない。