Wie kann ich einen Eintrag aus einem HABTM Join-Tabelle in Schienen löschen?
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?
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.