はじめに
Railsは、デフォルトだとレコードに連番でidを付けます。
それだと、URLにその連番のidが出力されるため、自分が何番目のユーザーなのか、サービスで何本目の記事を書いたのかなどが露出してしまいます。
ユーザー数のサービスだと人気がないことがバレてしまうことも。。。
そこで、Railsで主キーをuuidにする方法をまとめました。
PostgreSQLの拡張を有効化
以下のRailsコマンドを実行してマイグレーションファイルを作成します。
rails g migration enable_extension_for_uuid
マイグレーションファイルに以下のように記入してください。
20190129024253_enable_extension_for_uuid.rb
class EnableExtensionForUuid < ActiveRecord::Migration[5.2]
def change
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
end
end
初期化処理を追加
アプリケーション起動時にロードされる初期化処理に以下の内容を加えます。
config/initializers/generators.rb
Rails.application.config.generators do |g|
g.orm :active_record, primary_key_type: :uuid
end
設定内容を読みこませる必要がありますので、ここで必ずRailsを再起動して下さい。
再起動後にマイグレーションコマンドを実行します。
rails db:migrate
以下のような出力があれば成功です。
== 20190129024253 EnableExtensionForUuid: migrating ===========================
-- extension_enabled?("pgcrypto")
-> 0.0206s
-- enable_extension("pgcrypto")
-> 0.0771s
== 20190129024253 EnableExtensionForUuid: migrated (0.0981s) ==================
Userモデルを生成する
rails g model User name:string
20190129043612_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, id: :uuid do |t|
t.string :name
t.timestamps
end
end
end
マイグレーション
コンソールからマイグレーションコマンドを実行します。
rails db:migrate
以下のような出力であれば成功です。
== 20190129041857 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0618s
== 20190129041857 CreateUsers: migrated (0.0620s) =============================
確認
Rails consoleで確認します。
Rails c
> User.create
(0.2ms) BEGIN
User Create (7.2ms) INSERT INTO "users" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id" [["created_at", "2019-01-29 04:41:06.181904"], ["updated_at", "2019-01-29 04:41:06.181904"]]
(2.7ms) COMMIT
=> #<User id: "f15e0b60-d657-4b20-b5e7-2dacf99609dc", name: nil, created_at: "2019-01-29 04:41:06", updated_at: "2019-01-29 04:41:06">
<User id: "f15e0b60-d657-4b20-b5e7-2dacf99609dc"とあるように、user_idは1ではなく、uuidが付与されています。
他のModelもマイグレーションファイルで同じ記載をすれば実現出来ます。