【发布时间】:2014-04-22 01:00:07
【问题描述】:
以循环dependent: :destroy 问题为例:
class User < ActiveRecord::Base
has_one: :staff, dependent: :destroy
end
class Staff < ActiveRecord::Base
belongs_to :user, dependent: :destroy
end
如果我调用user.destroy,关联的staff 也应该被销毁。相反,调用staff.destroy 也应该销毁关联的user。
这在 Rails 3.x 中效果很好,但是在 Rails 4.0 中行为发生了变化(并在 4.1 中继续),因此形成了一个循环,最终你会得到一个错误,“堆栈级别太深”。一种明显的解决方法是使用before_destroy 或after_destroy 创建自定义回调来手动销毁关联的对象,而不是使用dependent: :destroy 机制。即使是 issue in GitHub opened for this 情况也有几个人推荐这种解决方法。
不幸的是,我什至无法让这种解决方法发挥作用。这就是我所拥有的:
class User < ActiveRecord::Base
has_one: :staff
after_destroy :destroy_staff
def destroy_staff
staff.destroy if staff and !staff.destroyed?
end
end
这不起作用的原因是staff.destroyed? 总是返回false。这样就形成了一个循环。
【问题讨论】:
-
您是否按照 Jken13579 的建议在两个模型中实现了该逻辑?
-
@xlembouras,没有尝试过,但我很确定它不会起作用。为了确定,我会在这周的某个时候尝试一下。我在下面写了为什么它不起作用。
-
@at。我的回答好运吗?
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-4.1