当列与 table 不匹配时,如何在 table 上可逆地 remove_foreign_key?

How do I reversibly remove_foreign_key on a table when the column doesn't match the table?

我尝试了以下方法

remove_foreign_key :users, :asset_types, column: :seek_asset_type_id

但是报错

StandardError: An error has occurred, this and all later migrations canceled:
wrong number of arguments (given 3, expected 1..2)

文档说它使用与 #add_foreign_key 相同的选项。

Documentation

该列之前是用

创建的
add_reference :users, :seek_asset_type, foreign_key: {to_table: :asset_types}

这是定义:

"fk_rails_4dcaa1c59c" FOREIGN KEY (seek_asset_type_id) REFERENCES asset_types(id)

请删除table_name

remove_foreign_key :users, column: :seek_asset_type_id

试试这个 我已经对其进行了测试并为我工作。

remove_foreign_key :users, name: "seek_asset_type_id"

使用revert:

def change
  revert do
    add_reference :users, :seek_asset_type, foreign_key: { to_table: :asset_types }
  end
end

另一种方法是通过名称还原迁移:

def change
  revert AddAssetTypeReferenceToUsers 
  # I made up this migration name, 
  # so please fill in the appropriate name
end

这似乎是 remove_foreign_key 中的缺陷,但您可以通过使用 reversible:

定义 add_foreign_key 反向操作来解决它
reversible do |dir|
  dir.up do
    remove_foreign_key :users, column: :seek_asset_type
  end
  dir.down do
    add_foreign_key :users, :asset_types, column: :seek_asset_type
  end
end