2012-10-07 61 views
2

我的數據庫中有一個觸發器,它生成一個隨機ID「BEFORE INSERT」。Postgresql觸發器不執行Rails Fixtures

對於在測試中使用的rails fixtures,它們不會生成(觸發器在db中,我檢查過)。

爲什麼?

+0

Offtopic:爲什麼不使用SERIAL數據類型來生成一個數字?幾乎適用於每種情況,並且比觸發器更快。 –

回答

0

Rails Fixtures不一定以滿足數據庫約束的順序加載,所以Rails解決方案是在加載fixture時關閉它們。

例如,在PostgreSQL,這裏是一些SQL Rails所執行

(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 

,或者如果它是專門要隨機主鍵列,你應該使用的UUID。

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