0

Nehmen sie diesen Fall als Beispiel:Wie kaskadiere ich polymorphe Assoziationen im aktiven Datensatz?

class Child < ActiveRecord::Base 
    belongs_to :fruitful, polymorphic: true 
end 

class Parent < ActiveRecord::Base 
    has_many :children, as: :fruitful, dependent: :destroy 
end 

# Once I create the parent and children 
p = Parent.create 
p.children << Child.new 
p.children << Child.new 
p.save 

# But deleting parent does not delete children: 
p.destroy # why not? 

Die Frage wird, ist „abhängig: zerstören“ nicht mit aktivem Rekord polymorpher Vereinigung unterstützt und muß ich before_destroy Rückruf implementieren, um verwaisten Datensätze zu verhindern?

Antwort

1

Sollte das belongs_to :parent sein?

Sie müssen möglicherweise nur anrufen parent.reload vor dem Anruf parent.destroy, so dass es weiß, Kinder ID ist. Wenn Sie << Child.new tun, kann das im Speicherobjekt die Daten nicht genau wiedergeben.

Edit: This guy explains it better!

In der Praxis erwarte ich, dass Sie normalerweise ein Objekt nicht direkt nach der Manipulation seiner Kinder zerstören würden, also ist dies wahrscheinlich ein Problem mit der Konsole und Sie sollten reload in Ihrer Anwendung nicht benötigen.

+1

Erstens, danke für die Beantwortung. Zweitens war dies ein vereinfachtes Beispiel, bei dem mein tatsächlicher Fall ein tatsächliches Modell ist, das mit "Kindern" gefüllt wurde, die eine polymorphe Assoziation verwenden, und die destroy-Methode wurde innerhalb einer "Zerstörungs" -Aktion des Controllers aufgerufen. Ich finde, dass alle NICHT-POLYMORFISCHEN Beziehungen aus der DB gelöscht werden, während polymorphe Beziehungen beibehalten werden. Ich habe bemerkt, dass die Rails-Dokumentation die Option "dependent:: destroy" NICHT enthält. – Vlad

+0

Hah! Erscheint habe ich vergessen, tatsächlich hinzufügen:: zerstören in meinem Code! – Vlad

Verwandte Themen