Spec-Zone.ru › Ruby on Rails 6.1

класс ActiveRecord::IrreversibleMigration

Родитель:
ActiveRecord::MigrationError

Exception которое может быть возбуждено для предотвращения отката миграций. Например, следующая миграция необратима. Откат этой миграции вызовет ошибку ActiveRecord::IrreversibleMigration.

class IrreversibleMigrationExample < ActiveRecord::Migration[6.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

Существует два способа решения этой проблемы.

  1. Определите методы #up и #down вместо метода #change:

class ReversibleMigrationExample < ActiveRecord::Migration[6.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
  1. Используйте метод reversible в методе #change:

class ReversibleMigrationExample < ActiveRecord::Migration[6.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–2020 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API