Я пытаюсь изменить id
поле за столом, чтобы быть uuid
Rails migrations - временно игнорировать ограничение внешнего ключа?
Вот мой код:
class AddUuidToProjects < ActiveRecord::Migration[5.0]
def up
add_column :projects, :uuid, :string, limit:36, null: false, first: true
add_column :projects, :old_id, :integer
Project.all.each do |p|
p.update!(old_id: p.id)
end
change_table :projects do |t|
t.remove :id
t.rename :uuid, :id
end
execute "ALTER TABLE projects ADD PRIMARY KEY (id);"
Project.all.each do |p|
# has_one image
Image.find(p.old_id).update!(project: p)
# has_many stories
Story.where(project_id: p.old_id).each do |s|
s.update!(project: p)
end
end
end
...
end
Эта миграция ломается при попытке t.remove :id
, из-за внешнего ключа. Сообщение об ошибке:
Mysql2::Error: Cannot drop column 'id': needed in a foreign key constraint 'fk_rails_be41fd4bb7' of table 'db_dev.stories': ALTER TABLE `projects` DROP `id`
Дело в том, если вся миграция побежал, то я бы поменять местами id
колонку с другой, и подправить внешние ключи тоже. Итак, есть ли способ игнорировать ограничения для миграции?
попытаться уронить ограничение первым затем добавить его позже http://stackoverflow.com/questions/14122031/how-to-remove-constraints-from-my-mysql-table – jvnill
вы также можете просто установить uuid в качестве основного ключа и просто позволить активной записи узнать об этом. http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/PrimaryKey/ClassMethods.html#method-i-primary_key – jvnill