From ebed70d3d09e8113a12c43feec986dfb7b95f86a Mon Sep 17 00:00:00 2001 From: Pranav Chaturvedi Date: Thu, 28 Aug 2014 09:38:15 +0530 Subject: [PATCH 1/2] denormalize_destroy_to_* trigger before destroy The to_alize destroy callbacks used to be a after_destroy callback which failed when relations specified a :nullify dependency - since mongoid would nullify all relations before the destroy and the after_destroy callback would find no children after the destroy op to sync. Changed the callback to be triggered before the destroy op, except in the case of a :restrict dependency where a before_destroy callback would pre-maturely sync the child objects even though the destroy op may never happen --- lib/mongoid/alize/to_callback.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/mongoid/alize/to_callback.rb b/lib/mongoid/alize/to_callback.rb index b8b14d7..03d1786 100644 --- a/lib/mongoid/alize/to_callback.rb +++ b/lib/mongoid/alize/to_callback.rb @@ -132,7 +132,11 @@ def set_callback def set_destroy_callback unless callback_attached?("destroy", aliased_destroy_callback_name) - klass.set_callback(:destroy, :after, aliased_destroy_callback_name) + if self.metadata.dependent == :restrict + klass.set_callback(:destroy, :after, aliased_destroy_callback_name) + else + klass.set_callback(:destroy, :before, aliased_destroy_callback_name) + end end end From 76e62fc43bf7aff25bede41e2160aeb87218f780 Mon Sep 17 00:00:00 2001 From: Pranav Chaturvedi Date: Thu, 28 Aug 2014 10:37:31 +0530 Subject: [PATCH 2/2] Spec update --- spec/mongoid/alize/to_callback_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/mongoid/alize/to_callback_spec.rb b/spec/mongoid/alize/to_callback_spec.rb index 0f499f6..73846d1 100644 --- a/spec/mongoid/alize/to_callback_spec.rb +++ b/spec/mongoid/alize/to_callback_spec.rb @@ -69,7 +69,7 @@ def define_and_create(callback_name=:define_callback) describe "#set_destroy_callback" do it "should set a destroy callback on the klass" do - mock(@callback.klass).set_callback(:destroy, :after, "denormalize_destroy_to_head") + mock(@callback.klass).set_callback(:destroy, :before, "denormalize_destroy_to_head") @callback.send(:set_destroy_callback) end