2017-09-20 14 views
0

Ich arbeite mit einer Datenbank, die viele Einschränkungen innerhalb des Schemas verwendet. Dies ist erforderlich, um sicherzustellen, dass andere Dienste und Clients, die die Datenbank verwenden, das Datenmodell nicht beschädigen (antworten Sie bitte nicht, dass diese Ebene der DB-Definition für eine Rails-Anwendung ungeeignet ist). Unglücklicherweise scheint dies Rails über seine Fähigkeit zu bringen, Schemas zu definieren, zu löschen und anschließend neu zu erstellen, es sei denn, jemand weiß etwas, das ich übersehen habe.Rails add_foreign_key beschränkt auf ein einzelnes Referenzfeld

Das spezifische Problem, das ich je erlebt habe, ist mit add_foreign_key Aussagen in schema.rb, und ich bin auf der Suche, um zu sehen, ob jemand eine Abhilfe weiß, dass mir die Einbettung von SQL direkt in die schema.rb Definition sparen.

Die Postgres DDL, die ich vertrete müssen, ist:

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; 

Leider, wenn ich rake db:schema:dump die vorhandene Datenbank zu schema.rb ergibt sich wie folgt zusammen:

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

Dies führt in einer ungültigen Spezifikation, wenn die Datenbank neu erstellt wird, die nur ein einzelnes Feld enthält und (glücklicherweise) nicht ausgeführt wird, da die resultierenden Schemaeinschränkungen falsch sind.

Ich habe versucht, die beiden Felder enthalten primary_key und Spalte Strings Option zu ändern, um die erforderlichen SQL anzupassen, aber Active setzt Anführungszeichen um die ganze Menge, die Anweisung ungültig SQL machen. Ich habe auch versucht, ein Array von Spalten zu verwenden, aber es scheint nur #to_s das Array.

Ist dies nur jenseits der Fähigkeit add_foreign_key, oder gibt es eine Möglichkeit, mehrere Felder in einer Fremdschlüsselspezifikation zu verwenden?

Antwort

0

Es scheint, dass es keine Überprüfung gibt, dass schema.rb die vollständige Datenbank gültig darstellen kann, wenn Sie datenbankspezifische DDL verwenden. Obwohl ich verstehe, dass schema.rb möglicherweise nicht alle Möglichkeiten darstellen kann, wird leider kein Fehler erzeugt, der anzeigt, dass das von Rake generierte Schema.rb ungültig ist.

Um einen vollständigen SQL-Dump der Datenbank, die von der Datenbank der eigenen Schema Dumping-Tool ausgeführt zu bekommen, habe ich:

config.active_record.schema_format = :sql 

application.rb. Dies stellt sicher, dass ich in Zukunft ein gültiges, brauchbares Datenbankschema für die Wiederherstellung einer Umgebung bekomme.

Verwandte Themen