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.

thanks !is there a way to force the irreversible migration from rake, or allow it only in development code ?
@billitch: no, you cannot force “the way back”. Of course, you can comment out the exception, but when you ‘re-migrate’ you’ll be in trouble, because you are doing the same migration twice.