不为Rails灯具执行Postgresql触发器

时间:2012-10-07 12:39:21

标签: ruby-on-rails ruby-on-rails-3 triggers fixtures

我的数据库中有一个触发器,它会生成一个随机ID" BEFORE INSERT"。

对于在测试中使用的rails fixtures,它们不会生成(触发器在db中,我检查过它)。

为什么?

1 个答案:

答案 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 
  );