LoginSignup
0
2

More than 3 years have passed since last update.

Rails ✕ PostgreSQLで既定のIDをUUIDに設定する方法

Posted at

動作環境

  • Ruby 2.7.0
  • Rails 6.0.3.2
  • PostgreSQL 12.3

準備

1. PostgreSQLデータベースを使用してRailsアプリケーションを作成します。

$ rails new blog -d=postgresql

2. config/database.yml でデータベース名を変更できます。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: blog_development

test:
  <<: *default
  database: blog_test

3. 下記のrailsコマンドで config/database.yml の内容でデータベースを作成してくれます。

$ rails db:create
Created database 'blog_development'
Created database 'blog_test'

PostgreSQLでUUIDを有効にする

通常、以下の手順で、プライマリキーとしてUUIDを使うことが出来ます。

1. マイグレーションファイル作成コマンドを実行します。

$ rails g migration enable_uuid

2. マイグレーションファイルの編集

# db/migrate/xxx_enable_uuid.rb
class EnableUuid < ActiveRecord::Migration[6.0]
  def change
    enable_extension 'pgcrypto'
  end
end

既定のIDをUUIDに設定する

config/initializers/generators.rb ファイルを作成して、中身を下記のようにします。

# config/initializers/generators.rb
Rails.application.config.generators do |g|
  g.orm :active_record, primary_key_type: :uuid
end

この設定でmodel作成時にidがuuidであるというオプションがmigrationファイルに自動で付与されるようになります。

確認

1. Postモデルを作成します。

$ rails g model Post title:string

2. マイグレーションファイルを確認します。

# db/migrate/xxx_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts, id: :uuid do |t|
      t.string :title

      t.timestamps
    end
  end
end

3. マイグレーション

$ rails db:migrate

4. レコードの作成

$ rails console
> Post.create(title: 'new post')
   (0.2ms)  BEGIN
  Post Create (25.3ms)  INSERT INTO "posts" ("title", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["title", "new post"], ["created_at", "2020-07-10 13:05:38.915722"], ["updated_at", "2020-07-10 13:05:38.915722"]]
   (7.0ms)  COMMIT
 => #<Post id: "464b7fa5-aaae-4970-a56f-b5c0cf6c1b83", title: "new post", created_at: "2020-07-10 13:05:38", updated_at: "2020-07-10 13:05:38"> 

プライマリキーがUUIDタイプになりました!

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