2009-05-07 19 views
6

Algo que yo no recibo ...ActiveRecord: la eliminación de registros asociados

tengo esto en mi modelo:

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 

y trato de hacer esto:

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

Pero esto no borra los registros del DB. En lugar Tengo que hacer esto:

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

... que no puede ser la mejor manera.
Entonces, ¿cuál es la mejor manera, por favor?

Respuesta

4

Garry tiene razón: model.options.clear

Pero se puede ir más allá y asociarlo con un modelo de devolución de llamada, si se ajusta a sus necesidades

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 

O puede usar this plugin para imponer relaciones de FK desde la base de datos agregando activadores de DB (si su db los entrega) apropiadamente.

espero que maight ayuda que

+0

curioso, es la devolución de llamada before_destroy necesario si usted tiene la: dependiente => : destruir la opción en su lugar? –

+0

No. No está comenzando Rails 3. –

1

En Rails 3 todo lo que tiene que hacer es :dependent => :destroy y ActiveRecord se hará cargo del resto

Cuestiones relacionadas