Pregunta

Con una has_many regular, existe la opción de :dependent => :destroy eliminar las asociaciones cuando se elimina el registro padre. Con has_many :through, puede haber otros padres asociados a los registros secundarios, por lo que no tiene :dependent => :destroy efecto alguno.

¿Cómo se asegura registros secundarios se eliminan después de que son huérfanos de la última asociación HMT?

¿Fue útil?

Solución

La solución que he encontrado parece ser 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

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top