mongoid/mongoid — Issue #1455: Embedded doc doesn't know if parent is being destroyed in before_destroy callback
Author: iamnader
Created: 2011-11-28 03:36:15+00:00
State: open

I need to use cascading callbacks for various reasons. In an embedded doc's before_destroy there is currently no way to determine if the parent is being destroyed. flagged_for_destroy isn't being set in that case. I need to know this because in the case of just deleting the child I need to do certain things that wouldn't be done if the parent is being deleted.

This is the current behavior I'm seeing:

```
class Parent
include Mongoid::Document

embeds_many :childs, :cascade_callbacks => true

before_destroy :before_callback
after_destroy :after_callback

def before_callback
puts
puts 'Parent#before_callback'
puts " flagged_for_destroy? = #{flagged_for_destroy?}"
puts " destroyed? = #{destroyed?}"
end

def after_callback
puts
puts 'Parent#after_callback'
puts " flagged_for_destroy? = #{flagged_for_destroy?}"
puts " destroyed? = #{destroyed?}"
end
end

class Child
include Mongoid::Document

embedded_in :parent

before_destroy :before_callback
after_destroy :after_callback

def before_callback
puts
puts 'Child#before_callback'
puts " parent is a #{parent.class} = #{parent.inspect}"
puts " parent.flagged_for_destroy? = #{parent.flagged_for_destroy?}"
puts " parent.destroyed? = #{parent.destroyed?}"
end

def after_callback
puts
puts 'Child#after_callback'
puts " parent is a #{parent.class} = #{parent.inspect}"
puts " parent.flagged_for_destroy? = #{parent.flagged_for_destroy?}"
puts " parent.destroyed? = #{parent.destroyed?}"
end
end

p = Parent.new
p.childs.create
p.save
p.destroy
```
produces this output:

```
Child#before_callback
parent is a Parent = #
parent.flagged_for_destroy? = false
parent.destroyed? = false

Parent#before_callback
flagged_for_destroy? = false
destroyed? = false

Parent#after_callback
flagged_for_destroy? = false
destroyed? = true

Child#after_callback
parent is a Parent = #
parent.flagged_for_destroy? = false
parent.destroyed? = true
```

I'm pretty sure this isn't the right way to do it, but if I set the flagged_for_destroy bool in Persistance#destroy (https://github.com/iamnader/mongoid-2/commit/6645e1f1db4b3697fdf91b1526cac1fd5c3b7b47) than I get these results which seem to make a lot more sense to me:

```
Child#before_callback
parent is a Parent = #
parent.flagged_for_destroy? = true
parent.destroyed? = false

Parent#before_callback
flagged_for_destroy? = true
destroyed? = false

Parent#after_callback
flagged_for_destroy? = true
destroyed? = true

Child#after_callback
parent is a Parent = #
parent.flagged_for_destroy? = true
parent.destroyed? = true
```