在删除最后一个has_many:through记录后销毁关联。

9

对于常规的has_many,有选项:dependent => :destroy以在删除父记录时删除相关联的关系。但是,使用has_many :through时,可能会存在其他与子记录相关联的父级,因此:dependent => :destroy没有任何效果。

如何确保在最后一个HMT关联中孤立的子记录被删除?

2个回答

13

我找到的解决方案似乎是使用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

为了深入研究一个旧的问题/答案,我有一个has_many :through关联;我在通过模型上调用了destroy,但我想删除可能被孤立的关联另一侧的任何模型。我将这段代码放在我的通过模型中,并且由于要被销毁的端点模型只是一个belongs_to,所以我删除了包装的each调用。感谢你给我指明正确的方向。 - Ben Kreeger

1

在联结模型中使用"belongs_to :model, dependent: :destroy"

例如,如果您想在医生被删除后同时销毁患者,而且医生通过预约拥有多个患者

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
我喜欢摧毁所有患者的想法 :)) - Christian Romeni
1
我希望只有在该患者的所有预约都被取消时才能删除该患者。 只要还有至少一个预约存在,我就希望该患者仍然存在(否则他将不会前来付款 :-))。 您的方法是否适用于此,或者会在任何预约被取消时都销毁该患者? - silverdr
1
即使患者有另一位(不同的)医生,这也会毁掉他们。如果预约被取消,它也会毁掉患者...我认为这对你在这里提供的情景没有意义-因此我会给它一个负评。我认为在Doctor和Patient中的has_many:appointments关系上都设置dependent::destroy是有意义的,但仅限于此。 - Louis Sayers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接