Rails 5:如何将现有模型的ID类型更改为UUID?

时间:2018-09-09 21:23:09

标签: ruby-on-rails

我正在尝试将Devise用户模型的id类型更改为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

为什么迁移失败?这暗示着什么?如何将ID类型更改为UUID?

1 个答案:

答案 0 :(得分:1)

对于post,建议与之重复,我设法将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