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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top