RoR3: After_destroy in Many to Many und trough

flattr this!

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!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>