123456789_123456789_123456789_123456789_123456789_

Exception: ActiveRecord::IrreversibleMigration

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, MigrationError, ActiveRecordError, StandardError
Instance Chain:
self, MigrationError, ActiveRecordError, StandardError
Inherits: ActiveRecord::MigrationError
Defined in: activerecord/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 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

Class Method Summary

MigrationError - Inherited

Constructor Details

This class inherits a constructor from ActiveRecord::MigrationError