Come posso eliminare una voce da un HABTM join tavolo rotaie?
Domanda
Attraverso molte iterazioni di test, ho appena notato che il mio join tabella che rappresenta una relazione HABTM tra due modelli non sta rimuovendo le voci, quando le istanze di questi modelli vengono eliminati. Ho bisogno di fare qualcosa di speciale quando si rimuove un'istanza di un modello che ha rapporti HABTM?
Soluzione
Al momento rapporti più stretti HABTM ispezione dovrebbe essere rimuovendo uniscono le voci della tabella. Tuttavia, né le relazioni HABTM o il rapporto che ho descritto nella versione originale (vedi storia post) di questa soluzione rimuoverà quelli uniscono voci della tabella quando si elimina il record con il metodo delete
. ActiveRecord::Base#delete
non attiva alcun callback, come quelli di un rapporto HABTM stabilisce per rimuovere voci orfane dalla tabella aderire. Invece si dovrebbe utilizzare ActiveRecord::Base#destroy
.
Si dovrà utilizzare SQL prime per rimuovere le voci non necessarie. Se si decide di creare un modello di unirsi, è possibile scorrere le voci nel modello unirsi, l'eliminazione di quelli senza un'associazione.
Esempio:
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? }
Altri suggerimenti
Le voci nella tabella di join devono essere sempre eliminati senza di te fare nulla di speciale. È possibile aggiungere l'opzione :delete_sql
al codice per modificare il comportamento se si dispone di una situazione strana. Eliminare l'oggetto sull'altro lato del join non è un comportamento di default.