我的数据库中有一个触发器,它会生成一个随机ID" BEFORE INSERT"。
对于在测试中使用的rails fixtures,它们不会生成(触发器在db中,我检查过它)。
为什么?
答案 0 :(得分:0)
Rails灯具不一定按照满足数据库约束的顺序加载,因此Rails解决方案是在加载灯具时关闭它们。
例如,对于postgresql,这里有一些Rails执行的SQL
(2.0ms) ALTER TABLE "admins" DISABLE TRIGGER ALL;ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "events" DISABLE TRIGGER ALL;
... insert all of the things
(2.1ms) ALTER TABLE "admins" ENABLE TRIGGER ALL;ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "events" ENABLE TRIGGER ALL;
无法使用fixture并让它们在加载时触发db触发器。使用https://github.com/thoughtbot/factory_girl之类的对象构建器将触发数据库触发器。
在你的情况下,有一种更好的方法来做你需要的事情
alter table mytable add column random_column double precision DEFAULT random() NOT NULL
或者如果它是您要随机化的主键列,则应使用uuids。
CREATE EXTENSION "uuid-ossp";
CREATE TABLE some_table (
id uuid PRIMARY KEY NOT NULL DEFAULT uuid_generate_v4(),
some_field character varying,
other_table_id uuid REFERENCES other_table (id) ON DELETE CASCADE NOT NULL
);