Rails 4.将表id迁移到UUID

我有一个表: db / migrate / 20140731201801_create_voc_brands.rb:

class CreateVocBrands < ActiveRecord::Migration def change create_table :voc_brands do |t| t.string :name t.timestamps end end end 

但我需要将表更改为此(如果我将从零创建它):

 class CreateVocBrands  false do |t| t.uuid :id, :primary_key => true t.string :name t.timestamps end add_index :voc_brands, :id end end 

如何使用迁移更改此设置?

我和你的问题一样。 要从默认ID迁移到使用uuid,我认为你可以使用类似于我的东西:

 class ChangeVocBrandsPrimaryKey < ActiveRecord::Migration def change add_column :voc_brands, :uuid, :uuid, default: "uuid_generate_v4()", null: false change_table :voc_brands do |t| t.remove :id t.rename :uuid, :id end execute "ALTER TABLE voc_brands ADD PRIMARY KEY (id);" end end 

我知道迁移是进行任何数据库更改的首选方法,但是下面的方法很棒。 可以使用直接查询PostgreSQL来转换表与现有数据。

对于主键:

  ALTER TABLE students ALTER COLUMN id DROP DEFAULT, ALTER COLUMN id SET DATA TYPE UUID USING (uuid(lpad(replace(text(id),'-',''), 32, '0'))), ALTER COLUMN id SET DEFAULT uuid_generate_v4() 

对于其他参考:

  ALTER TABLE students ALTER COLUMN city_id SET DATA TYPE UUID USING (uuid(lpad(replace(text(city_id),'-',''), 32, '0'))) 

上面的左边用零填充整数值并转换为UUID。 这种方法不需要id映射,如果需要,可以检索旧id。

由于没有数据复制,这种方法非常快。

要处理这些更复杂的多态关联案例,请使用https://github.com/kreatio-sw/webdack-uuid_migration 。 此gem为ActiveRecord :: Migration添加了其他帮助程序,以简化这些迁移。