我有以下迁移:
class AddMyColumn < ActiveRecord::Migration[6.1]
def change
add_column :my_table, :my_new_column, :bigint
add_foreign_key :my_table, :my_other_table, column: :my_new_column
add_index :my_table, :my_new_column
end
end
撤消此迁移时,我看到此错误:
Mysql2::Error: Cannot drop index 'index_my_table_on_my_new_column': needed in a foreign key constraint
Rails 指南明确指出使用这些操作的
change
迁移应该是可逆的。
重新排序
add_foreign_key
和 add_index
操作(或在本例中,使用 add_reference
)可以成功逆转迁移。然而,这似乎与文档所述相矛盾:
Active Record 知道如何自动反转迁移的操作...[使用时]
支持的操作。如果您需要使用任何其他方法,您应该使用可逆或编写向上和向下方法,而不是使用更改方法change
add_column
add_foreign_key
和 add_index
都是受支持的操作。
change
方法是否对操作进行任何分析以便适当地反转它们?或者只是以相反的顺序应用它们?此行为是否记录在任何地方?
更改方法是否对操作执行任何分析以便适当地反转它们?
有一个类负责反转已知方法:
https://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html#method-i-inverse_of
或者只是以相反的顺序应用它们?此行为是否记录在任何地方?
迁移方法在
change
方法内从下往上执行(您可以在日志中看到它):
https://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html#method-i-revert
执行给定块时,记录将处于恢复模式。所有记录的命令最终都会被记录恢复并以相反的顺序。