2009-05-07 11 views
6

Qualcosa Non ricevo ...ActiveRecord: l'eliminazione di record associati

ho questo nel mio modello:

class Model < ActiveRecord::Base 
    has_many :model_options # a link table for many to many 
    has_many :options, 
      :through => :model_options, 
      :dependent => :destroy, 
      :foreign_key => 'model_id' 
end 

e cerco di fare questo:

model = Model.find(id) 
model.options.delete # also tried model.options.delete_all 

Ma questo non sta cancellando i record dal DB. Invece sto avendo a che fare questo:

model.options.each do |option| 
    option.delete 
end 

... che non può essere il modo migliore.
Quindi qual è il modo migliore, per favore?

risposta

4

Garry ha ragione: model.options.clear

Ma si può andare oltre e associarlo a un modello di callback, se si adatta alle tue esigenze

class Model < ActiveRecord::Base 
has_many :model_options # a link table for many to many 
has_many :options, 
     :through => :model_options, 
     :dependent => :destroy, 
     :foreign_key => 'model_id' 

# Clear options records before destroy 
before_destroy :clear_options 

protected 
    def clear_options 
    options.clear 
    end 
end 

Oppure è possibile utilizzare this plugin per applicare le relazioni FK dal database aggiungendo trigger DB (se il proprio particolare sapore db supp orts loro) appropriatamente.

spero che l'aiuto maight si

+0

curioso, è il before_destroy richiamata necessaria se avete la: dipendente => : distruggere l'opzione in atto? –

+0

No. Non sta avviando Rails 3. –

1

In Rails 3 tutto ciò che dovete fare è :dependent => :destroy e ActiveRecord si prenderà cura di tutto il resto

Problemi correlati