在Rails中after_destroy回调顺序

Cha*_*nya 3 callback ruby-on-rails-3.1

我使用PostgreSql作为数据库和Rails 3.1.3和ruby 1.9.3我有3个模型.

  • Activity
  • ActivityObject
  • ActivityObjectActivity

他们是这样联系的.

活动

has_many:activity_object_activities,:dependent =>:destroy
has_many:activity_objects,:through =>:activity_object_activities

after_destroy:do_something_on_activity_object_related

ActivityObject

has_many:activity_object_activities,:dependent =>:destroy
has_many:activities,:through =>:activity_object_activities

ActivityObjectActivity

belongs_to:activity,:dependent =>:destroy
belongs_to:activity_object

当我做了对的活动破坏,我观察activity_object_activities表项的调用之前得到删除do_something_on_activity_object_relateddependent: destroy.因此,当do_something_on_activity_object_related活动被销毁时调用方法时,它无法找到activity_object与活动相关联的方法.

有没有一种方法可以do_something_on_activity_object_related在与活动相关的关联被销毁之前调用它.有什么方法可以改变after_destroy回调的顺序.

提前致谢.

Mat*_*att 6

您可以自己负责地删除/销毁依赖项,并确保在完成后触发它们 do_something_on_activity_object_related

而不是

has_many :activity_object_activities,:dependent => :destroy
has_many :activity_objects, :through => :activity_object_activities

after_destroy :do_something_on_activity_object_related
Run Code Online (Sandbox Code Playgroud)

做这个:

has_many :activity_object_activities
has_many :activity_objects, :through => :activity_object_activities

after_destroy do
    do_something_on_activity_object_related

    ActivityObjectActivity.destroy_all(activity_id: self.id)
end
Run Code Online (Sandbox Code Playgroud)

从联接表中删除项目时,您应该使用delete_all而不是destroy_all.但你在你的例子中使用了破坏,我也在这里使用它.