Rails 迁移 `change` 方法如何反转其操作?

问题描述 投票:0回答:1

我有以下迁移:

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
方法是否对操作进行任何分析以便适当地反转它们?或者只是以相反的顺序应用它们?此行为是否记录在任何地方?

ruby-on-rails rails-migrations
1个回答
0
投票

更改方法是否对操作执行任何分析以便适当地反转它们?

有一个类负责反转已知方法:
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

执行给定块时,记录将处于恢复模式。所有记录的命令最终都会被记录恢复并以相反的顺序

© www.soinside.com 2019 - 2024. All rights reserved.