after_destroy заказ обратного вызова в Rails - PullRequest
3 голосов
/ 24 января 2012

Я использую PostgreSql в качестве базы данных, а Rails 3.1.3 и ruby ​​1.9.3 у меня 3 модели.

  • Activity
  • ActivityObject
  • ActivityObjectActivity

Они связаны таким образом.

Активность

has_many: activity_object_activities,: зависимый =>:уничтожить
has_many: activity_objects,: through =>: activity_object_activities

after_destroy: do_something_on_activity_object_related

ActivityObject

has_man:Activity_object_activities,: зависимый =>: уничтожить
has_many: действия,: через =>: активность_объект_активности

ActivityObjectActivity

принадлежит_активности,: зависимый =>: уничтожить
принадлежат_то: активность_объекта

Когда я выполняю уничтожение для действия, я вижу, что запись в таблице activity_object_activities удаляется перед вызовом do_something_on_activity_object_related из-заdependent: destroy.Поэтому из-за этого, когда метод do_something_on_activity_object_related вызывается при уничтожении действия, он не может обнаружить activity_object, связанный с действием.

Есть ли метод, с помощью которого я могу вызватьэто do_something_on_activity_object_related до уничтожения ассоциаций, связанных с деятельностью.Есть ли способ изменить порядок обратных вызовов after_destroy.

Заранее спасибо.

1 Ответ

6 голосов
/ 04 мая 2012

Вы можете взять на себя ответственность за удаление / уничтожение зависимостей самостоятельно и убедиться, что они срабатывают после того, как вы закончите 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

сделайте следующее:

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

При удалении элементов из объединяющей таблицы у вас все будет в порядке, используя delete_all вместо destroy_all.Но вы использовали в своем примере уничтожение, чтобы я использовал это и здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...