2009-04-19 11 views
9

Mit einem regulären has_many gibt es die Option :dependent => :destroy, die Verknüpfungen zu löschen, wenn der übergeordnete Datensatz gelöscht wird. Mit has_many :through sind möglicherweise andere Eltern den untergeordneten Datensätzen zugeordnet, sodass :dependent => :destroy keine Auswirkungen hat.Verknüpfungen nach dem letzten has_many löschen: Durch Datensatz gelöscht

Wie stellen Sie sicher, dass untergeordnete Datensätze gelöscht werden, nachdem sie aus der letzten HMT-Zuordnung verwaist sind?

Antwort

12

Die Lösung, die ich gefunden habe scheint ein after_destroy Rückruf, wie dies zu sein:

class Parent < ActiveRecord::Base 
    has_many :children, :through => :parentage 
    after_destroy :destroy_orphaned_children 

    private 

    def destroy_orphaned_children 
    children.each do |child| 
     child.destroy if child.parents.empty? 
    end 
    end 

end 
+0

Um in eine alte Frage/Antwort zu stoßen, hatte ich eine 'has_many: through' Assoziation; Ich nannte 'destroy' auf dem Through-Modell, aber ich wollte jedes Modell auf der anderen Seite der Assoziation löschen, das verwaist sein könnte. Ich habe diesen Code in mein Through-Modell eingefügt, und da das Modell am Ende, das zerstört wird, nur ein 'gehört' ist, habe ich den Aufruf 'jedes' entfernt. Danke für den Schub in die richtige Richtung. –

3

Auf dem Modell verbinden, verwenden

zum Beispiel "belongs_to: Modell abhängig: zerstören", wenn Sie einen Patienten zerstören möchten, sobald ihr Arzt zerstört ist, und Arzt has_many Patienten obwohl Verabredungen

Class Appointment 
    belongs_to :doctor 
    belongs_to :patient, dependent: :destroy 

Class Doctor 
    has_many :appointments, dependent: :destroy 
    has_many :patients, through: :appointments 

Class Patient 
    has_many :appointments 
    has_many :doctors, through: :appointments 
+2

Ich mag die Idee, alle Patienten zu zerstören :)) –

+0

Ich möchte einen Patienten nur zerstören, wenn alle seine Termine zerstört werden. Solange noch mindestens ein Termin übrig ist, möchte ich, dass der Patient am Leben bleibt (sonst kommt er nicht und zahlt :-) Ist Ihre Herangehensweise dafür geeignet oder zerstört sie den Patienten, wenn irgendeine der Termine zerstört wird? – silverdr

Verwandte Themen