diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index d37e489f5c10b..124a2419ec661 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -669,10 +669,13 @@ def rename_column_sql(table_name, column_name, new_column_name) rename_column_sql end - def remove_column_sql(table_name, *column_names) - columns_for_remove(table_name, *column_names).map {|column_name| "DROP #{column_name}" } + def remove_column_sql(table_name, column_name, type = nil, options = {}) + "DROP #{quote_column_name(column_name)}" + end + + def remove_columns_sql(table_name, *column_names) + column_names.map {|column_name| remove_column_sql(table_name, column_name) } end - alias :remove_columns_sql :remove_column def add_index_sql(table_name, column_name, options = {}) index_name, index_type, index_columns = add_index_options(table_name, column_name, options) diff --git a/activerecord/lib/active_record/migration.rb b/activerecord/lib/active_record/migration.rb index 273af32237285..67339c05e5305 100644 --- a/activerecord/lib/active_record/migration.rb +++ b/activerecord/lib/active_record/migration.rb @@ -477,7 +477,7 @@ def down # end def reversible helper = ReversibleBlockHelper.new(reverting?) - transaction{ yield helper } + execute_block{ yield helper } end # Runs the given migration classes. @@ -639,6 +639,15 @@ def next_migration_number(number) "%.3d" % number end end + + private + def execute_block + if connection.respond_to? :execute_block + super # use normal delegation to record the block + else + yield + end + end end # MigrationProxy is used to defer loading of the actual migration classes diff --git a/activerecord/lib/active_record/migration/command_recorder.rb b/activerecord/lib/active_record/migration/command_recorder.rb index a6377185a8199..79c55045bac32 100644 --- a/activerecord/lib/active_record/migration/command_recorder.rb +++ b/activerecord/lib/active_record/migration/command_recorder.rb @@ -73,7 +73,7 @@ def respond_to?(*args) # :nodoc: [:create_table, :create_join_table, :rename_table, :add_column, :remove_column, :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps, :change_column_default, :add_reference, :remove_reference, :transaction, - :drop_join_table, :drop_table, + :drop_join_table, :drop_table, :execute_block, :change_column, :execute, :remove_columns, # irreversible methods need to be here too ].each do |method| class_eval <<-EOV, __FILE__, __LINE__ + 1 @@ -94,6 +94,7 @@ def change_table(table_name, options = {}) module StraightReversions private { transaction: :transaction, + execute_block: :execute_block, create_table: :drop_table, create_join_table: :drop_join_table, add_column: :remove_column, diff --git a/activerecord/test/cases/invertible_migration_test.rb b/activerecord/test/cases/invertible_migration_test.rb index cf4e39c4effb3..be59ffc4ab2d3 100644 --- a/activerecord/test/cases/invertible_migration_test.rb +++ b/activerecord/test/cases/invertible_migration_test.rb @@ -89,8 +89,10 @@ def change end def teardown - if ActiveRecord::Base.connection.table_exists?("horses") - ActiveRecord::Base.connection.drop_table("horses") + %w[horses new_horses].each do |table| + if ActiveRecord::Base.connection.table_exists?(table) + ActiveRecord::Base.connection.drop_table(table) + end end end diff --git a/railties/test/application/rake/migrations_test.rb b/railties/test/application/rake/migrations_test.rb index 0a47fd014c73b..33c753868cba3 100644 --- a/railties/test/application/rake/migrations_test.rb +++ b/railties/test/application/rake/migrations_test.rb @@ -50,9 +50,9 @@ class AMigration < ActiveRecord::Migration assert_match(/AddEmailToUsers: migrated/, output) output = `rake db:rollback STEP=2` - assert_match(/drop_table\("users"\)/, output) + assert_match(/drop_table\(:users\)/, output) assert_match(/CreateUsers: reverted/, output) - assert_match(/remove_column\("users", :email\)/, output) + assert_match(/remove_column\(:users, :email, :string\)/, output) assert_match(/AddEmailToUsers: reverted/, output) end end