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?