Уничтожить ассоциации после последнего has_many: сквозная запись удалена - PullRequest
9 голосов
/ 20 апреля 2009

Для обычного has_many есть опция :dependent => :destroy для удаления связей при удалении родительской записи. С has_many :through могут быть другие родители, связанные с дочерними записями, поэтому :dependent => :destroy не имеет никакого эффекта.

Как вы гарантируете удаление дочерних записей после того, как они стали сиротами из последней ассоциации HMT?

Ответы [ 2 ]

13 голосов
/ 20 апреля 2009

Решение, которое я нашел, похоже на обратный вызов after_destroy, например:

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
2 голосов
/ 10 сентября 2012

В модели соединения используйте «own_to: модель, зависимая:: уничтожить»

например, если вы хотите уничтожить пациента после того, как его врач уничтожен, и у доктора есть много пациентов, хотя назначения

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
...