2009-04-13 9 views
0

Ich habe eine Sequenz von ActiveRecord-Objekten, die ich kaskadieren möchte, aber einige der Objekte werden nicht entfernt.beeinflusst das Klonen ActiveRecord Callbacks?

Im Wesentlichen habe ich wie folgt: -

class Project < ActiveRecord::Base 

    has_many :tasks, :dependent => :destroy 
    has_many :schedules, :dependent => :destroy 
    has_many :project_schedules, :through => :schedules, :class_name => "Project", :dependent => :destroy 

end 

class Schedule < ActiveRecord::Base 

    belongs_to :project_schedule, :class_name => "Project" 
    belongs_to :project 

end 

class Task < ActiveRecord::Base 

    belongs_to :project 

end 

wo Projekt eine Definition eines Projekts ist, Aufgabe eine Definition einer Aufgabe an diesem Projekt und Planen Sie einen has_many: durch das ein originelles Projekt in ein anderes Projekt verbindet , das ist ein Zeitplan des ursprünglichen Projekts.

Wenn ich einen Zeitplan erstelle, klammere ich das ursprüngliche Projekt (d. H. Der Zeitplan ist ein Klon des ursprünglichen Projekts und jede der Aufgaben im Zeitplan sind Klone der Aufgaben im ursprünglichen Zeitplan).

Wenn ich ein schedule.destroy mache, würde ich erwarten, dass das Schedule-Projekt und alle zugehörigen Tasks gelöscht werden. Es wird jedoch nur das Zeitplanprojekt gelöscht, die Zeitplanaufgaben bleiben bestehen.

Dies ist kein Caching-Problem, da sich die Datensätze noch in der Datenbank befinden. Außerdem werden in der Datenbank definitiv separate Aufgaben mit einer Zeitplan-ID als Projekt-ID und einer eigenen eigenen ID erstellt.

Feuern Callbacks immer noch auf geklonte Objekte? Habe ich hier einen Trick verpasst?

Antwort

1

Aus dem Aussehen Ihrer Klassenbeschreibungen würde ich kein kaskadierendes Löschen erwarten, wenn Sie ein Schedule-Objekt zerstören. Wenn Sie ein Projektobjekt löschen, sollte Rails die untergeordneten Aufgaben und Zeitpläne durchlaufen (nicht wirklich sicher, was der Projektplan hier ist) und die Datensätze aufgrund der Option :dependent => :destroy löschen. Aufgaben und Zeitpläne sind untergeordnete Elemente von Project und würden nicht dazu führen, dass ein übergeordnetes Element gelöscht wird.

Wenn Sie das übergeordnete Projekt entfernen möchten, wenn ein Zeitplan gelöscht wird, würde ich wahrscheinlich einen after_delete Rückruf schreiben.

+0

Danke, Michael. Du hast recht, ich habe es falsch verstanden. Ich schaue mir den Rückruf nach dem Löschen an. Danke vielmals. –