首页 > 解决方案 > 如何在 Rails 迁移中使触发器可逆

问题描述

我在 Ruby on Rails 中编写迁移包含触发器,当我回滚时出现以下错误:

ActiveRecord::IrreversibleMigration: 

This migration uses execute, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
2. Use the #reversible method to define reversible behavior.

我在更改函数中定义了所有表和触发器:

class Geolocation < ActiveRecord::Migration[5.0]
    def change
     [...]
     execute <<-SQL
        CREATE OR REPLACE FUNCTION zone_preset_jolly_city() RETURNS trigger
        LANGUAGE plpgsql AS 
        $$BEGIN
          INSERT INTO cities( zone_preset_id, name ) VALUES ( NEW.zone_id, '%' );
          RETURN NEW;
        END;$$;

        CREATE OR REPLACE FUNCTION city_jolly_toponym() RETURNS trigger
        LANGUAGE plpgsql AS 
        $$BEGIN
          INSERT INTO toponyms( city_id, toponym_type_id, name ) VALUES ( NEW.city_id, '%', '%' );
          RETURN NEW;
        END;$$;

        CREATE OR REPLACE FUNCTION toponym_jolly_street_number() RETURNS trigger
        LANGUAGE plpgsql AS 
        $$BEGIN
          INSERT INTO street_numbers( toponym_id, number ) VALUES ( NEW.toponym_id, '%' );
          RETURN NEW;
        END;$$; 

        CREATE TRIGGER zone_preset_jolly
          AFTER INSERT ON zone_presets
          FOR EACH ROW EXECUTE PROCEDURE zone_preset_jolly_city();

        CREATE TRIGGER city_jolly_toponym
          AFTER INSERT ON cities
          FOR EACH ROW EXECUTE PROCEDURE city_jolly_toponym();

        CREATE TRIGGER toponym_jolly_street_number
          AFTER INSERT ON toponyms
          FOR EACH ROW EXECUTE PROCEDURE toponym_jolly_street_number();
      SQL
end

所以我试图定义一个向上和向下的函数来正确地还原触发器,但我不知道如何将它们定义为反向。有什么建议么?

标签: ruby-on-railspostgresqltriggersmigration

解决方案


如果您不关心迁移中的数据更改是可逆的,那么只需将您的更改方法重命名为up并创建一个空的 down 方法:

class Geolocation < ActiveRecord::Migration[5.0]

  # this used to be def change
  def up
    ...
    ...
  ...
  end

  def down
  end
end

如果您确实关心使其可逆,那么您需要反转您在 up 方法中执行的任何事务并在您的 down 方法中运行它们。但当然,并非一切都是完全可逆的。


推荐阅读