Skip to main content

The migration that cannot be undone: Irreversible Migration

·154 words·1 min· ·
General
Ariejan de Vroom
Author
Ariejan de Vroom
Jack of all Trades, Professional Software Craftsman

Migrations have up and down methods, as we all know. But in some cases, your up method does things you can’t undo in your down method.

For example:

def self.up
  # Change the zipcode from the current :integer to a :string type.
  change_column :address, :zipcode, :string
end

Now, converting integers to strings will always work. But, you feel it coming, converting a string into an integer will not always be possible. In other words, we can’t reverse this migration.

That’s why we should raise ActiveRecord::IrreversibleMigration in the down method.

def self.down
  raise ActiveRecord::IrreversibleMigration
end

Now, if you run your migration (upwards), you’ll see it being applied like it shoud. However, if you try to go back, you’ll see rake aborting with ActiveRecord::IrreversibleMigration.

$ rake db:migrate VERSION=4
-- Database is migrated
$ rake db:migrate VERSION=3
-- Rake aborted!
-- ActiveRecord::IrreversibleMigration

So, if you have things you can’t undo, raise ActiveRecord::IrreversibleMigration in your migration’s down method.

Related

Permanently redirect WordPress pages
·249 words·2 mins
General Wordpress Apache Apache2 Rewrite Mod_rewrite Permalinks
Debian Etch: RMagick LoadError
·148 words·1 min
General RubyOnRails Ruby Ruby on Rails Rails Imagemagick LibMagickWand Magick Rmagick
Enabling Trac Email notifications
·205 words·1 min
General Trac Email Notifications Tricks