Exception: ActiveRecord::IrreversibleMigration

Inherits:
MigrationError show all
Defined in:
lib/active_record/migration.rb

Overview

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[8.1]
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.

  1. Define #up and #down methods instead of #change:

class ReversibleMigrationExample < ActiveRecord::Migration 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

  1. Use the #reversible method in #change method:

class ReversibleMigrationExample < ActiveRecord::Migration 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

Method Summary

Methods inherited from MigrationError

#initialize

Constructor Details

This class inherits a constructor from ActiveRecord::MigrationError