Exception,用于阻止迁移回滚。例如,以下迁移是不可逆的。回滚此迁移将引发 ActiveRecord::IrreversibleMigration 错误。
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
有两种方法可以缓解此问题。
-
定义 up 和 down 方法而不是 change 方法
class ReversibleMigrationExample < ActiveRecord::Migration[8.1] 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
-
在 change 方法中使用 reversible 方法
class ReversibleMigrationExample < ActiveRecord::Migration[8.1] 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