diff --git a/activerecord/lib/active_record/migration/command_recorder.rb b/activerecord/lib/active_record/migration/command_recorder.rb index f01e94169f..d06e050db3 100644 --- a/activerecord/lib/active_record/migration/command_recorder.rb +++ b/activerecord/lib/active_record/migration/command_recorder.rb @@ -93,11 +93,11 @@ module ActiveRecord [:remove_timestamps, args] end - # Forwards any missing method call to the \target. + # Record all the methods called in the +change+ method of a migration. + # This will ensure that IrreversibleMigration is raised when the corresponding + # invert_method does not exist while the migration is rolled back. def method_missing(method, *args, &block) - @delegate.send(method, *args, &block) - rescue NoMethodError => e - raise e, e.message.sub(/ for #<.*$/, " via proxy for #{@delegate}") + record(method, args) end end diff --git a/activerecord/test/cases/migration/command_recorder_test.rb b/activerecord/test/cases/migration/command_recorder_test.rb index 0f79c99e1a..a03c80bf93 100644 --- a/activerecord/test/cases/migration/command_recorder_test.rb +++ b/activerecord/test/cases/migration/command_recorder_test.rb @@ -14,9 +14,11 @@ module ActiveRecord assert recorder.respond_to?(:america) end - def test_send_calls_super - assert_raises(NoMethodError) do - @recorder.send(:non_existing_method, :horses) + def test_non_existing_method_records_and_raises_on_inversion + @recorder.send(:non_existing_method, :horses) + assert_equal 1, @recorder.commands.length + assert_raises(ActiveRecord::IrreversibleMigration) do + @recorder.inverse end end