4

データベースに、ランダムID「BEFOREINSERT」を生成するトリガーがあります。

テストで使用されたレールフィクスチャの場合、それらは生成されません(トリガーはデータベースにあります、私はそれをチェックしました)。

どうして?

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;

フィクスチャを使用してロード時に db トリガーをトリガーする方法はありません。https://github.com/thoughtbot/factory_girlのようなオブジェクト ビルダーを使用すると、 db トリガーがトリガーされます。

ただし、あなたの場合、必要なことを行うためのより良い方法があります

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 
  ); 
于 2013-03-14T03:06:31.853 に答える