ruby-on-rails - 如何在 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
所以我试图定义一个向上和向下的函数来正确地还原触发器,但我不知道如何将它们定义为反向。有什么建议么?
解决方案
如果您不关心迁移中的数据更改是可逆的,那么只需将您的更改方法重命名为up
并创建一个空的 down 方法:
class Geolocation < ActiveRecord::Migration[5.0]
# this used to be def change
def up
...
...
...
end
def down
end
end
如果您确实关心使其可逆,那么您需要反转您在 up 方法中执行的任何事务并在您的 down 方法中运行它们。但当然,并非一切都是完全可逆的。
推荐阅读
- ruby-on-rails - 如何使用 HTTParty 提取 JSON 数组字段?
- python-2.7 - 如何更新满足列条件的numpy列?
- html - 溢出后下拉菜单出错:隐藏放置
- angular - Angular 6中的孩子与父母的沟通
- javascript - 在 JQuery 中将代码应用于其父 div 的内部元素单击问题
- python - Python 更改参考
- sql-server - “INFORMATION_SCHEMA.TABLES”的脚本
- php - 保存来自标签输入的数据
- jquery - 如何在rails中为新创建的东西(在ajax调用之后)放置分页
- ms-word - Microsoft Office 加载项 javascript:按 matchPrefix:true 搜索 - 如何获取匹配前缀的完整单词