2017-09-20 7 views
0

私は、スキーマ内で定義された多くの制約を使用するデータベースを扱っています。これは、データベースを使用する他のサービスやクライアントがデータモデルを破壊しないようにするために必要です(このレベルのDB定義がRailsアプリケーションには不適切であると返信しないでください)。残念ながら、これは、誰かが私が逃したことを知っていない限り、Railsはスキーマの定義、ダンプ、その後の再作成の能力を超えているようです。Rails add_foreign_keyが単一の参照フィールドに限定されています

私が遭遇した特定の問題はschema.rbadd_foreign_key文であり、そして私は誰もがschema.rb定義に直接SQLを埋め込む私を保存します回避策を知っているかどうかを確認するために探しています。

私が表現するために必要

PostgresのDDLは次のとおりです。

add_foreign_key "trackers", "sub_processes", 
    column: "protocol_id", 
    primary_key: "protocol_id", 
    name: "valid_protocol_sub_process" 

この結果:

ALTER TABLE ONLY trackers 
    ADD CONSTRAINT valid_protocol_sub_process 
    FOREIGN KEY (protocol_id, sub_process_id) 
    REFERENCES sub_processes(protocol_id, id) MATCH FULL; 

残念ながら、私はschema.rbこれは以下になりに、既存のデータベースをrake db:schema:dumpとき無効な指定で、データベースを再作成するときに、単一のフィールドのみを含み、結果としてスキーマ制約が正しくないため実行できません。

私は必要なSQLに一致するように両方のフィールドを含めるようにPRIMARY_KEYオプション文字列を変更しようとしているが、ActiveRecordのは、SQL文が無効作り、全体の多くの前後に引用符を置きます。私も列の配列を使用しようとしましたが、それはちょうど#to_s配列に表示されます。

これはちょうどadd_foreign_keyの能力を超えているのですか、または外部キー仕様で複数のフィールドを使用する方法がありますか?

答えて

0

データベース固有のDDLを使用すると、schema.rbが完全なデータベースを有効に表すことができるかどうかは確認されていないようです。 schema.rbはすべての可能性を表すことができないかもしれませんが、残念ながらrakeによって生成されたschema.rbが無効であることを示すエラーはありません。データベースの完全なSQLダンプを取得するために

は、データベース自身のスキーマダンプツールによって実行される、私が追加:

config.active_record.schema_format = :sql 

application.rbします。これにより、今後、環境を再構築するために有効で使用可能なデータベーススキーマが得られることが保証されます。

関連する問題