【问题标题】:Destroy associations after the last has_many :through record is deleted在最后一个 has_many :through 记录被删除后销毁关联
【发布时间】:2010-10-20 11:05:37
【问题描述】:

对于普通的has_many,有:dependent => :destroy 的选项可以在删除父记录时删除关联。使用has_many :through,可能还有其他父母与子记录相关联,因此:dependent => :destroy 没有任何作用。

如何确保子记录在上一次 HMT 关联中成为孤立的子记录后被删除?

【问题讨论】:

    标签: ruby-on-rails activerecord has-many-through


    【解决方案1】:

    我找到的解决方案似乎是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 调用。感谢您朝正确的方向推动。
    【解决方案2】:

    在连接模型上,使用“belongs_to :model,dependent: :destroy”

    例如,如果你想在医生被摧毁后摧毁一个病人,而医生通过预约有_many病人

    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
    

    【讨论】:

    • 我喜欢消灭所有病人的想法:))
    • 我只想在他的所有预约都被销毁时才销毁他。只要至少还有一个预约,我希望病人还活着(否则他不会来支付:-)你的方法是否适合这种情况,或者只要任何预约被破坏,它就会破坏病人吗?
    • 这将摧毁病人,即使他们有另一个(不同的)医生与被摧毁的医生不同。如果约会被破坏,它也会破坏病人......我认为这对于你在这里给出的场景没有意义 - 因此是反对票。我认为在这里将dependent: :destroy 放在医生和患者的has_many :appointments 关系上是有意义的,但仅此而已。
    猜你喜欢
    • 2010-11-26
    • 2013-05-30
    • 2017-09-23
    • 2020-02-08
    • 2019-09-23
    • 2014-01-22
    • 2015-07-31
    • 2014-06-03
    • 2014-05-03
    相关资源
    最近更新 更多