I really like the Rails 3 style migrations, i.e. one change
method being smart enough to recognize if the migrations is being installed or rolled back, so I don't have to write up
and down
methods mirroring each other. But I have situation that I need to skip some code when the migration is rolled back (updating counter_cache
columns that I'm adding).
I looked at http://guides.rubyonrails.org/migrations.html but the examples at the end of section 5 suffer from the same problem:
class AddFuzzToProduct < ActiveRecord::Migration
class Product < ActiveRecord::Base
end
def change
add_column :products, :fuzz, :string
Product.reset_column_information
Product.all.each { |f| f.update_attributes! :fuzz => 'fuzzy' }
end
end
When this migration is rolled back, the update of fuzz
field is unnecessary. Is there a way to prevent it?
I tried looking into Product.column_names
but since Rails is smart enough to perform migration in reverse direction, the update is executed before the column is removed. Also, when change
method is defined, any up
or down
methods seem to be ignored. Any other ideas?