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

У меня есть ситуация, когда я хотел бы обновить зависимость родительского объекта после того, как другой объект был уничтожен.Вот пример иерархии классов:Проблема в том, что когда родитель уничтожается, он уничтожает условие, которое затем вызывает обратный вызов after_destroy и сохраняет информационный объект после того, как он уже был уничтожен.Таким образом, после уничтожения родителя информация все еще существует.Если я не пропущу валидацию, сохранение молча завершится неудачей, чего я не хочу.И с помощью сохранения!выдвигает исключениеОбратный вызов для Condition должен быть after_destroy, потому что в противном случае метод пересчета в Info не будет иметь правильного представления состояния отношений для вычисления того, что ему нужно.Я чувствую, что мне нужен способ обойти обратные вызовы, когда родитель уничтожен, но я не думаю, что это возможно.Я не могу использовать зависимый => delete_all, потому что это не уничтожит потомков Условия.Я попытался выяснить, есть ли способ узнать, вызвал ли родитель уничтожение, и использовать эту информацию для обхода сохранения в after_destroy, но это тоже не сработало.Любая помощь будет принята с благодарностью, спасибо!
4 голоса | спросил atironati 16 Jam1000000amWed, 16 Jan 2013 02:47:20 +040013 2013, 02:47:20

1 ответ


0
Я вижу там 2 варианта:Не используйте обратный вызов ---- +: = 0 =: + ---- для Условия, а ожидайте, что информация будет пересчитана тем, кто уничтожает Условие.Это самое чистое, потому что вы разделяете две разные цели: уничтожение объекта и расчет.Вы можете увидеть, где это было бы более полезно, если, скажем, когда-нибудь вы захотите уничтожить 2 условия сразу и пересчитать только после того, как оба будут уничтожены.Вы не можете сделать это с обратным вызовом.Это также более точно соответствует Закону Деметры - вызывающий ---- +: = 1 =: + ---- вызывающий ---- +: = 2 =: + ---- лучше чем Условный вызов---- +: = 3 =: + ---- .Если вы действительно хотите упаковать это поведение в Condition, создайте функцию ---- +: = 4 =: + ----, которая вызывается вместо ---- +: = 5 =: + ----с неким скрытым обратным вызовом.Для абонентов более очевидно, что вы собираетесь начать пересчет.Удалите ---- +: = 6 =: + ---- из родительской ассоциации ---- +: = 7 =: + ---- и замените ее своей собственной ---- +: = 8=: + ---- обратный вызов на ---- +: = 9 =: + ----, который приведет к уничтожению ---- +: = 10 =: + ---- без обратных вызовов.В условии, я бы создал этот метод, скажем, ---- +: = 11 =: + ---- , и в нем ---- +: = 12 =: + ---- потомки условия, затем вызватьусловие ---- +: = 13 =: + ---- само.Функциональность ---- +: = 14 =: + ---- великолепна, но с такими циклами, я думаю, самый ясный метод на сегодняшний день - сделать это очень ясно, что вы делаете, убрав некоторые измагия и управление объектом и жизненным циклом процесса более четко.
ответил Matt 16 Jam1000000amWed, 16 Jan 2013 03:13:54 +040013 2013, 03:13:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132