Ich hatte folgendes Problem bei der Entwicklung einer kleinen Warenwirtschaft mit Rails: Ich habe zwei Models: Master und Feature. Sie stehen in einer many to many Beziehung zueinander und zwar durch das Model Blueprint. Was ich wollte, war, wenn ein Feature gelöscht wird, soll noch meine Aktion ausgeführt werden. Das geschieht auch, wenn ein Blueprint gelöscht wird, denn es verbindet den Master und das Feature und beim Löschen von Features eines Masters mitgelöscht wird. So in Theorie. In der Praxis geht das nicht.
class Master < ActiveRecord::Base
has_many :blueprints, :dependent => :delete_all
has_many :features, :through => :blueprints
end
class Feature < ActiveRecord::Base
has_many :blueprints, :dependent => :delete_all
has_many :masters, :through => :blueprints
end
class Blueprint < ActiveRecord::Base
belongs_to :master
belongs_to :feature
after_destroy :delete_variations
def delete_variations
puts "-- delete_variations --" # wird nicht ausgeführt..
end
end
# löschen geschieht mit master.features.replace(selected_features)
Das funktioniert nicht. Das Callback after_destroy wird nicht aufgerufen. Rails ruft dieses Callback nur beim Aufruf von der Methode destroy an dem Blueprint Objekt (oder an seinem Parent). Es muss was anderes her.
class Master < ActiveRecord::Base
has_many :blueprints, :dependent => :delete_all
has_many :features, :through => :blueprints, :after_remove => :delete_variations
def delete_variations(feature)
puts "-- delete_variations --" # wird ausgeführt!!
end
end
Das Ganze spielt sich nicht in dem Blueprint-Model, sondern in dem Master. Und es funktioniert!
