Rails 5: Как я могу изменить тип идентификатора существующей модели на UUID? - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь изменить тип идентификатора модели Devise User на uuid.

Моя миграция выглядит так:

class ChangeUserIdTypeToUuid < ActiveRecord::Migration[5.2]

  def up
    change_column :users, :id, :uuid
  end

  def down
    change_column :users, :id, :integer
  end
end

Но когда я запускаю миграцию, я получаю ошибку:

== 20180909205634 ChangeUserIdTypeToUuid: migrating ===========================
-- change_column(:users, :id, :uuid)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DatatypeMismatch: ERROR:  column "id" cannot be cast automatically to type uuid
HINT:  You might need to specify "USING id::uuid".
: ALTER TABLE "users" ALTER COLUMN "id" TYPE uuid

Там есть подсказка, но я не знаю, что она предлагает мне сделать.Это не так:

change_column :users, :id, id::uuid

Почему не удается выполнить миграцию?Что подсказывает подсказка?Как изменить тип идентификатора на UUID?

1 Ответ

0 голосов
/ 10 сентября 2018

Ссылаясь на сообщение , которое было предложено дублировать, мне удалось изменить тип id на uuid следующим образом:

class ChangeUserIdTypeToUuid < ActiveRecord::Migration[5.2]

  def change
    add_column :users, :uuid, :uuid, default: "gen_random_uuid()", null: false

    change_table :users do |t|
      t.remove :id
      t.rename :uuid, :id
    end
    execute "ALTER TABLE users ADD PRIMARY KEY (id);"
  end
end

Отличие от лучшего ответа в связанном вопросе заключается в способе генерации UUID. В качестве базы данных для разработки я использую postgresql, поэтому использую gen_random_uuid(), предоставляемый расширением pgcrypto, которое я ранее включил при подготовке использования UUID в другой модели:

class EnablePgcryptoExtension < ActiveRecord::Migration[5.2]
  def change
    enable_extension 'pgcrypto'
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...