2017-11-17 1 views
1

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?

Antwort

0

Es stellt sich heraus hinzufügen, was ich versuche nicht zu tun, nicht sinnvoll.

Irrelevant für mein first_node_task Attribut, Nodes haben eine Reihe von NodeTasks, so etwas zu denen NodeTasks auf Node Löschung geschehen muss. Was auch immer passiert mit Kind NodeTasks wird mit der first_node_task passieren, weil es einer von ihnen ist.

Ich erkannte, dass ich wollen tun tatsächlich NodeTasks gelöscht werden, was bedeutet, dass, wenn first_node_task gesetzt ist, wäre es auch gelöscht werden.

Ich löste dies durch eine Migration Hinzufügen des Fremdschlüssel zwischen NodeTask und Node Änderungen beim Löschen kaskadieren, wie so:

remove_foreign_key :node_tasks, :nodes 
add_foreign_key :node_tasks, :nodes, on_delete: :cascade 
0

Versuchen dependent: :nullify zu

class Node 
    belongs_to :first_node_task, class_name: 'NodeTask', foreign_key: 'first_node_task_id', optional: true, dependent: :nullify 
end 
+0

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

+0

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. –

Verwandte Themen