在具有has_many
belongs_to
关联的rails 4应用程序中,应如何实现双向:dependent => :destroy
功能?
以Contact
和Organisation
为例。期望的行为如下:
:dependent => :destroy
上的has_many
设置条件满足条件1和2,但不满足条件1。
class Organisation < ActiveRecord::Base
has_many :contacts, :dependent => :destroy
end
class Contact < ActiveRecord::Base
belongs_to :organisation
end
在:dependent => :destroy
上设置belongs_to
满足条件1和3,但不满足2。
class Organisation < ActiveRecord::Base
has_many :contacts
end
class Contact < ActiveRecord::Base
belongs_to :organisation, :dependent => :destroy
end
实现这种行为的最简洁方法是什么?
答案 0 :(得分:0)
我找到了一种解决方案,可以在不设置: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
而不是覆盖Organisation#destroy
我试过在:dependent => :destroy
关联上设置has_many :contacts
,但是我相信这创建了一个无限循环,因为它导致应用程序抛出'堆栈级别太深'错误。
调用self.contacts.delete_all
似乎可以避免这个问题,但我不知道为什么。