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并没有很好地清理不必要的关系,这个解决方案感觉不是特别干净。因此,我暂时暂缓将这个答案标记为正确,希望有人能想出一个更优雅的方法。