In rails, How to determine if a record was destroyed by a dependent: :destroy callback?
activerecord, callback, ruby-on-rails
Solution
Solution #1
If your model is simple enough and you don't need to invoke any callbacks in the child relation, you can just use `dependent: delete_all` in the parent.
Solution #2
For more complex scenarios you can use `destroyed_by_association`, which returns a `ActiveRecord::Reflection::HasManyReflection` object when it's part of cascade, or nil otherwise:
after_destroy :your_callback
def your_callback
if destroyed_by_association
# this is part of a cascade
else
# isolated deletion
end
end
I just tried this in Rails 4.2 and it works.
Source: https://github.com/rails/rails/issues/12828#issuecomment-28142658
Problem
I've got a record in my Rails app with an `after_destroy` hook that needs to be aware of why the record gets destroyed. More specifically, if the record is being destroyed in a cascade because its parent says `dependent: :destroy`, it needs to do things differently than if the record was individually destroyed. What I tried to do is to see if its parent was `destroyed?`, only to figure out that `dependent: :destroy` callbacks are done before the parent is destroyed. Which makes sense because it should be able to fail. (i.e. restrict). So, how do I do this?