在rails中,如何确定记录是否被依赖的:: destroy回调破坏?

The*_*ter 11 activerecord ruby-on-rails callback

我在我的Rails应用程序中有一个记录after_destroy,需要知道记录被破坏的原因.更具体地说,如果记录在级联中被破坏,因为它的父级说dependent: :destroy,它需要做的事情与记录被单独销毁时不同.

我试图做的是看看它的父母是否destroyed?,只是想知道dependent: :destroy在父母被摧毁之前完成了回调.这是有道理的,因为它应该能够失败.(即限制).

那么,我该怎么做?

alf*_*alf 8

解决方案#1

如果您的模型足够简单并且您不需要在子关系中调用任何回调,则可以dependent: delete_all在父关系中使用.

解决方案#2

对于可以使用的更复杂的场景destroyed_by_association,ActiveRecord::Reflection::HasManyReflection当它是级联的一部分时返回一个对象,否则返回nil:

after_destroy :your_callback

def your_callback
  if destroyed_by_association
    # this is part of a cascade
  else
    # isolated deletion
  end
end
Run Code Online (Sandbox Code Playgroud)

我刚刚在Rails 4.2中尝试了这个并且它可以工作.

资料来源:https://github.com/rails/rails/issues/12828#issuecomment-28142658