Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Raise RecordNotDestroyed when children can't be replaced #13042

Merged
merged 2 commits into from
Nov 26, 2013
Merged

Raise RecordNotDestroyed when children can't be replaced #13042

merged 2 commits into from
Nov 26, 2013

Conversation

brianstorti
Copy link
Contributor

Fixes #12812.
Raise ActiveRecord::RecordNotDestroyed when a child marked with dependent: destroy can't be destroyed.

The following code:

class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
end

class Comment < ActiveRecord::Base
  before_destroy do
    return false
  end
end

post = Post.create!(comments: [Comment.create!])
post.comments = [Comment.create!]

would result in a post with two comments.
With this change, the same code would raise a RecordNotDestroyed exception, keeping the post with the same comment.

Fixes #12812
Raise `ActiveRecord::RecordNotDestroyed` when a child marked with
`dependent: destroy` can't be destroyed.

The following code:
```ruby
class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
end

class Comment < ActiveRecord::Base
  before_destroy do
    return false
  end
end

post = Post.create!(comments: [Comment.create!])
post.comments = [Comment.create!]
````

would result in a `post` with two `comments`.
With this commit, the same code would raise a `RecordNotDestroyed`
exception, keeping the `post` with the same `comment`.
@@ -1042,4 +1042,10 @@

*Slava Markevich*

* Raise `ActiveRecord::RecordNotDestroyed` when a replaced child marked with `dependent: destroy` fails to be destroyed.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move the CHANGELOG entry to the top

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved.

@rafaelfranca
Copy link
Member

I don't think I can backport this one, but I'll gladly include this on 4.1

@carlosantoniodasilva
Copy link
Member

👍

rafaelfranca added a commit that referenced this pull request Nov 26, 2013
Raise `RecordNotDestroyed` when children can't be replaced
@rafaelfranca rafaelfranca merged commit e4c0a22 into rails:master Nov 26, 2013
naiyt added a commit to naiyt/rails that referenced this pull request Apr 15, 2015
This is a proposal for a possibly better solution to commit rails#13042.
Currently, Rails will raise ActiveRecord::RecordNotDestroyed if you call
destroy on a model, but that model has children with dependent: :destroy
set, and those models fail to be destroyed. This causes issues if you
need to perform some action in the parent's before_destroy regardless of
whether the children fail to be destroyed.

This switches back to calling destroy instead of destroy! on the
children. The original issue (rails#12812) is resolved in this commit by only
raising an ActiveRecord::RecordNotSaved exception when you are replacing
a dependent: :destroy child, and not when calling destroy on the parent.
naiyt added a commit to naiyt/rails that referenced this pull request Apr 15, 2015
This is a proposal for a possibly better solution to commit rails#13042.
Currently, Rails will raise ActiveRecord::RecordNotDestroyed if you call
destroy on a model, but that model has children with dependent: :destroy
set, and those models fail to be destroyed. This causes issues if you
need to perform some action in the parent's before_destroy regardless of
whether the children fail to be destroyed.

This switches back to calling destroy instead of destroy! on the
children. The original issue (rails#12812) is resolved in this commit by only
raising an ActiveRecord::RecordNotSaved exception when you are replacing
a dependent: :destroy child, and not when calling destroy on the parent.
naiyt added a commit to naiyt/rails that referenced this pull request Mar 1, 2016
This is a proposal for a possibly better solution to commit rails#13042.
Currently, Rails will raise ActiveRecord::RecordNotDestroyed if you call
destroy on a model, but that model has children with dependent: :destroy
set, and those models fail to be destroyed. This causes issues if you
need to perform some action in the parent's before_destroy regardless of
whether the children fail to be destroyed.

This switches back to calling destroy instead of destroy! on the
children. The original issue (rails#12812) is resolved in this commit by only
raising an ActiveRecord::RecordNotSaved exception when you are replacing
a dependent: :destroy child, and not when calling destroy on the parent.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Does not fail replacing children when destroy of a child fails.
3 participants