Ruby on rails ActiveRecord-双向:依赖=>;:摧毁有很多<-&燃气轮机;属于协会

Ruby on rails ActiveRecord-双向:依赖=>;:摧毁有很多<-&燃气轮机;属于协会,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,在具有的rails 4应用程序中,有许多属于关联,如何实现双向:dependent=>:destroy功能 以联系人和组织为例。期望的行为如下: 摧毁一个组织将摧毁该组织和所有相关联系人 销毁与具有多个联系人的组织关联的联系人只会销毁该联系人 销毁与组织关联的最后一个联系人将销毁该联系人和关联的组织 在上设置:dependent=>:destroy满足条件1和2,但不满足条件3 班级组织:destroy 结束 类联系人:销毁所属的满足条件1和3,但不满足条件2 班级组织:destroy的情况下实

在具有
的rails 4应用程序中,有许多
属于
关联,如何实现双向
:dependent=>:destroy
功能

联系人
组织
为例。期望的行为如下:

  • 摧毁一个组织将摧毁该组织和所有相关联系人
  • 销毁与具有多个联系人的组织关联的联系人只会销毁该联系人
  • 销毁与组织关联的最后一个联系人将销毁该联系人和关联的组织
  • 上设置
    :dependent=>:destroy
    满足条件1和2,但不满足条件3

    班级组织:destroy
    结束
    类联系人
    设置
    :dependent=>:销毁
    所属的
    满足条件1和3,但不满足条件2

    班级组织:销毁
    结束
    

    实现这种行为最干净的方法是什么?

    我找到了一种解决方案,可以在不设置
    :dependent=>:destroy的情况下实现所需的行为:

    class Organisation < ActiveRecord::Base
      has_many :contacts
    
      def destroy
        self.contacts.delete_all if self.contacts.any?
        super
      end
    
    class Contact < ActiveRecord::Base
      belongs_to :organisation
    
      after_destroy :cascade_destroy
    
      private
    
      def cascade_destroy
        self.organisation.destroy if self.organisation.contacts.empty?
      end
    end
    
    班级组织
    我没有覆盖
    组织#destroy
    而是尝试设置
    :dependent=>:destroy
    上的
    has\u many:contacts
    关联,但是我相信这创建了一个无限循环,因为它导致应用程序抛出了一个“堆栈级别太深”错误


    调用
    self.contacts.delete\u all
    似乎可以避免这个问题,尽管我不知道为什么。

    我不久前也有同样的问题,并使用了这个gem(而不是手动实现每个关系),但它是与ActiveRecord3一起使用的,但是新的AR4并没有很好地清理不必要的关系,这个解决方案感觉不是特别干净。因此,我暂时暂缓将这个答案标记为正确,希望有人能想出一个更优雅的方法。