Frage

Durch viele Wiederholungen der Prüfung, ich habe gerade bemerkt, dass mein Tisch kommen, die eine HABTM Beziehung zwischen zwei Modellen darstellen, ist keine Einträge zu entfernen, wenn Instanzen dieser Modelle gelöscht. Muss ich etwas Besonderes tun, wenn eine Instanz eines Modells zu entfernen, die HABTM Beziehungen hat?

War es hilfreich?

Lösung

Bei genauerem Hinsehen HABTM Beziehungen sollten Tabelleneinträge werden entfernt beitreten. Weder HABTM Beziehungen oder die Beziehung, die ich in der ursprünglichen Version beschrieben (siehe Post Geschichte) diese Lösung wird diejenigen Tabelleneinträge beitreten entfernen, wenn Sie den Datensatz mit dem delete Verfahren zu beseitigen. ActiveRecord::Base#delete löst keine Rückrufe, wie die, die eine Beziehung HABTM verwaiste Einträge zu entfernen, stellt aus der Tabelle zu verbinden. Stattdessen sollten Sie die Verwendung ActiveRecord::Base#destroy sein.

Sie haben rohe SQL verwenden, um die nicht mehr benötigte Einträge zu entfernen. Wenn Sie sich entscheiden, ein Join-Modell zu erstellen, können Sie durch die Einträge iterieren in dem Modell verbinden, die ohne eine Assoziation zu löschen.

Beispiel:

class Foo < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :bars, :through => :foo_bars
end

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :foo_bars, :dependent => :destroy
  has_many :foos, :through => :foo_bars
end

FooBar.all.each{|fb| fb.destroy? if fb.foo.nil? || fb.bar.nil? }

Andere Tipps

Die Einträge in dem Join-Tabelle gelöscht bekommen sollte, ohne dass Sie etwas Besonderes zu tun. Sie können die :delete_sql Option, um Ihren Code hinzufügen, um das Verhalten zu ändern, wenn Sie eine seltsame Situation. Das Löschen des Objekts auf der anderen Seite der Verbindung ist kein Standardverhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top