2009-04-19 10 views
9

Con un has_many regular, existe la opción de :dependent => :destroy para eliminar las asociaciones cuando se elimina el registro primario. Con has_many :through, puede haber otros padres asociados a los registros secundarios, por lo que :dependent => :destroy no tiene ningún efecto.Destruir asociaciones después del último has_mucho: mediante el registro se elimina

¿Cómo se asegura de que los registros secundarios se eliminen una vez que quedan huérfanos desde la última asociación HMT?

Respuesta

12

La solución que he encontrado parece haber una devolución de llamada after_destroy, como este:

class Parent < ActiveRecord::Base 
    has_many :children, :through => :parentage 
    after_destroy :destroy_orphaned_children 

    private 

    def destroy_orphaned_children 
    children.each do |child| 
     child.destroy if child.parents.empty? 
    end 
    end 

end 
+0

para meter en una vieja pregunta/respuesta, que tenía un 'has_many: through' assocation; Llamé a 'destroy' en el modelo directo, pero quería eliminar cualquier modelo del otro lado de la asociación que pudiera quedar huérfano. Coloqué este código dentro de mi modelo y, dado que el modelo que se destruyó en el extremo era solo 'belongs_to', eliminé la llamada 'each' de cada envoltura. Gracias por el empujón en la dirección correcta. –

3

En el modelo de unirse, utilice "belongs_to: modelo, dependiente:: destruir"

por ejemplo, Si quieres destruir un paciente una vez que su médico se destruye, y los pacientes médico has_many aunque citas

Class Appointment 
    belongs_to :doctor 
    belongs_to :patient, dependent: :destroy 

Class Doctor 
    has_many :appointments, dependent: :destroy 
    has_many :patients, through: :appointments 

Class Patient 
    has_many :appointments 
    has_many :doctors, through: :appointments 
+2

Me gusta la idea de destruir a todos los pacientes :)) –

+0

Quiero destruir a un paciente solo cuando TODAS sus citas son destruidas. Mientras haya al menos una cita, quiero que el paciente permanezca con vida (de lo contrario, no vendrá y pagará :-) ¿Su enfoque es adecuado para eso o destruirá al paciente cada vez que se destruya CUALQUIERA de las citas? – silverdr

Cuestiones relacionadas