提交 a186663b 编写于 作者: A Aster Ryan

Add an invert method for remove_foreign_key

上级 e2dfa54d
* Make remove_foreign_key invertible. Any foreign key options must be
specified, similar to remove_column.
*Aster Ryan*
* Correctly handle decimal arrays with defaults in the schema dumper.
Fixes #20515.
......
......@@ -777,7 +777,10 @@ def add_foreign_key(from_table, to_table, options = {})
execute schema_creation.accept(at)
end
# Removes the given foreign key from the table.
# Removes the given foreign key from the table. Any options parameters provided
# will be used to re-add the foreign key in case of a migration reversion.
# It is recommended that you provide any options used when creating the foreign
# key so that the migration can be reverted properly.
#
# Removes the foreign key on +accounts.branch_id+.
#
......@@ -791,6 +794,8 @@ def add_foreign_key(from_table, to_table, options = {})
#
# remove_foreign_key :accounts, name: :special_fk_name
#
# The +options+ hash can include all keys that can be used in add_foreign_key.
# Please refer to the add_foreign_key documentation for a full list
def remove_foreign_key(from_table, options_or_to_table = {})
return unless supports_foreign_keys?
......
......@@ -184,6 +184,16 @@ def invert_add_foreign_key(args)
[:remove_foreign_key, [from_table, options]]
end
def invert_remove_foreign_key(args)
from_table, to_table, remove_options = args
raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil? || to_table.is_a?(Hash)
reversed_args = [from_table, to_table]
reversed_args << remove_options if remove_options
[:add_foreign_key, reversed_args]
end
# Forwards any missing method call to the \target.
def method_missing(method, *args, &block)
if @delegate.respond_to?(method)
......
......@@ -281,17 +281,42 @@ def test_invert_add_foreign_key
assert_equal [:remove_foreign_key, [:dogs, :people]], enable
end
def test_invert_remove_foreign_key
enable = @recorder.inverse_of :remove_foreign_key, [:dogs, :people]
assert_equal [:add_foreign_key, [:dogs, :people]], enable
end
def test_invert_add_foreign_key_with_column
enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id"]
assert_equal [:remove_foreign_key, [:dogs, column: "owner_id"]], enable
end
def test_invert_remove_foreign_key_with_column
enable = @recorder.inverse_of :remove_foreign_key, [:dogs, :people, column: "owner_id"]
assert_equal [:add_foreign_key, [:dogs, :people, column: "owner_id"]], enable
end
def test_invert_add_foreign_key_with_column_and_name
enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id", name: "fk"]
assert_equal [:remove_foreign_key, [:dogs, name: "fk"]], enable
end
def test_remove_foreign_key_is_irreversible
def test_invert_remove_foreign_key_with_column_and_name
enable = @recorder.inverse_of :remove_foreign_key, [:dogs, :people, column: "owner_id", name: "fk"]
assert_equal [:add_foreign_key, [:dogs, :people, column: "owner_id", name: "fk"]], enable
end
def test_invert_remove_foreign_key_with_primary_key
enable = @recorder.inverse_of :remove_foreign_key, [:dogs, :people, primary_key: "person_id"]
assert_equal [:add_foreign_key, [:dogs, :people, primary_key: "person_id"]], enable
end
def test_invert_remove_foreign_key_with_on_delete_on_update
enable = @recorder.inverse_of :remove_foreign_key, [:dogs, :people, on_delete: :nullify, on_update: :cascade]
assert_equal [:add_foreign_key, [:dogs, :people, on_delete: :nullify, on_update: :cascade]], enable
end
def test_invert_remove_foreign_key_is_irreversible_without_to_table
assert_raises ActiveRecord::IrreversibleMigration do
@recorder.inverse_of :remove_foreign_key, [:dogs, column: "owner_id"]
end
......@@ -299,6 +324,10 @@ def test_remove_foreign_key_is_irreversible
assert_raises ActiveRecord::IrreversibleMigration do
@recorder.inverse_of :remove_foreign_key, [:dogs, name: "fk"]
end
assert_raises ActiveRecord::IrreversibleMigration do
@recorder.inverse_of :remove_foreign_key, [:dogs]
end
end
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册