Rails 4. Миграция идентификатора таблицы в UUID
У меня есть таблица:
дб/мигрирует/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 < ActiveRecord::Migration
def change
create_table :voc_brands, :id => false do |t|
t.uuid :id, :primary_key => true
t.string :name
t.timestamps
end
add_index :voc_brands, :id
end
end
Как я могу изменить это с помощью миграции?
Ответы
Ответ 1
У меня была такая же проблема, как у вас. Чтобы перейти от 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
Ответ 2
просмотрите
http://www.lshift.net/blog/2013/09/30/changing-the-primary-key-type-in-ruby-on-rails-models
можете ли вы получить свой ответ.
Ответ 3
Я знаю, что миграция является предпочтительным способом внесения любых изменений в db, но ниже подход является удивительным. Для преобразования таблицы с существующими данными можно использовать прямые запросы к 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. Этот подход не требует сопоставления идентификатора и при необходимости может быть восстановлен старый идентификатор.
Поскольку копирование данных не выполняется, этот подход работает довольно быстро.
Чтобы справиться с этими и более сложными случаями полиморфных ассоциаций, используйте https://github.com/kreatio-sw/webdack-uuid_migration. Этот жемчуг добавляет дополнительные помощники в ActiveRecord:: Migration, чтобы облегчить эти миграции.