Ich habe ein Problem mit Beziehungen, die ich zwischen einigen Modellen zu erstellen versuche.Erstellen einer unidirektionalen Beziehung ohne Fremdschlüssel
Ich habe eine Knoten, die viele NodeTasks hat. Dies ist so modelliert, dass NodeTask belongs_to :node
, die wie erwartet funktioniert.
ich auch einen Verweis auf einen beliebigen NodeTask auf Knoten hinzufügen möchten - lassen Sie sich first_node_task
sagen, als optionales Attribut. Hier habe ich Probleme.
konnte ich es zusammen hacken, so dass node.first_node_task
gesetzt werden kann und arbeitete als mit der folgenden Migration zu erwarten:
add_reference :nodes, :first_node_task, { type: :uuid, foreign_key: { to_table: :node_tasks } }
und Modell:
class Node
belongs_to :first_node_task, class_name: 'NodeTask', foreign_key: 'first_node_task_id', optional: true
end
Allerdings fand ich, dass ich konnte Löschen Sie nicht mehr diese Knoten, wegen der Bezugnahme auf NodeTask. Es würde einige seltsame umgekehrte Beziehung mit dem Fremdschlüssel auf: ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: update or delete on table "nodes" violates foreign key constraint "fk_rails_696709283b" on table "node_tasks"
Wie kann ich meine Referenzen modellieren, so dass Knoten einen first_node_task
Satz haben kann, die einen Verweis auf eine beliebige NodeTask ist, ohne die Auswirkungen auf verwandt NodeTask?
kein Glück, leider - aber ich denke, vielleicht ist dies nicht das, was ich Ich versuche es zu tun. Wenn für einen Knoten eine NodeTask festgelegt ist und der Knoten gelöscht wird, sollte die NodeTask ebenfalls nicht gelöscht werden. Sie sollte unabhängig davon vorhanden sein. Das "first_node_task" -Attribut auf Node sollte keine Beziehung erstellen, in der die NodeTask vom Node abhängig ist, sondern nur eine optionale Referenz auf eine NodeTask. Hoffentlich macht das Sinn! – ttarik
Es gibt eine Möglichkeit, einen Knoten zu löschen und keine NodeTask zu löschen. Verwenden Sie 'dependent:: nullify '. Dadurch wird ein Fremdschlüssel im NodeTask-Datensatz ungültig. Antwort bearbeitet. –