Подтвердить что ты не робот

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

Как я могу изменить это с помощью миграции?

4b9b3361

Ответ 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

Ответ 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, чтобы облегчить эти миграции.