class ActiveRecord::IrreversibleMigration
Exception that can be raised to stop migrations from being rolled back. For example the following migration is not reversible. Rolling back this migration will raise an ActiveRecord::IrreversibleMigration error.
class IrreversibleMigrationExample < ActiveRecord::Migration[5.0] def change create_table :distributors do |t| t.string :zipcode end execute <<~SQL ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; SQL end end
There are two ways to mitigate this problem.
-
Define
#up
and#down
methods instead of#change
:
class ReversibleMigrationExample < ActiveRecord::Migration[5.0] def up create_table :distributors do |t| t.string :zipcode end execute <<~SQL ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; SQL end def down execute <<~SQL ALTER TABLE distributors DROP CONSTRAINT zipchk SQL drop_table :distributors end end
-
Use the reversible method in
#change
method:
class ReversibleMigrationExample < ActiveRecord::Migration[5.0] def change create_table :distributors do |t| t.string :zipcode end reversible do |dir| dir.up do execute <<~SQL ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; SQL end dir.down do execute <<~SQL ALTER TABLE distributors DROP CONSTRAINT zipchk SQL end end end end
© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.