Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Migration#reversible by not using transaction. #8588

Merged
merged 1 commit into from Dec 23, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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)
Expand Down
11 changes: 10 additions & 1 deletion activerecord/lib/active_record/migration.rb
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion activerecord/lib/active_record/migration/command_recorder.rb
Expand Up @@ -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
Expand All @@ -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,
Expand Down
6 changes: 4 additions & 2 deletions activerecord/test/cases/invertible_migration_test.rb
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions railties/test/application/rake/migrations_test.rb
Expand Up @@ -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
Expand Down