4

我的数据库中有一个触发器,它生成一个随机 id “BEFORE INSERT”。

对于测试中使用的 rails 固定装置,它们不会生成(触发器在数据库中,我检查过)。

为什么?

4

1 回答 1

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;

没有办法使用固定装置并让它们在加载时触发数据库触发器。使用像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 
  ); 
于 2013-03-14T03:06:31.853 回答