35 lines
1.3 KiB
Markdown
35 lines
1.3 KiB
Markdown
---
|
|
title: "The migration that cannot be undone: Irreversible Migration"
|
|
kind: article
|
|
slug: the-migration-that-cannot-be-undone-irreversible-migration
|
|
created_at: 2008-05-06
|
|
tags:
|
|
- General
|
|
---
|
|
|
|
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:
|
|
|
|
<pre lang="ruby">def self.up
|
|
# Change the zipcode from the current :integer to a :string type.
|
|
change_column :address, :zipcode, :string
|
|
end</pre>
|
|
|
|
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.
|
|
|
|
<pre lang="ruby">def self.down
|
|
raise ActiveRecord::IrreversibleMigration
|
|
end</pre>
|
|
|
|
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.
|
|
|
|
<pre lang="sh">$ rake db:migrate VERSION=4
|
|
-- Database is migrated
|
|
$ rake db:migrate VERSION=3
|
|
-- Rake aborted!
|
|
-- ActiveRecord::IrreversibleMigration</pre>
|
|
|
|
So, if you have things you can't undo, raise ActiveRecord::IrreversibleMigration in your migration's down method. |