diff options
author | Fernando Gorodscy <fegorodscy@gmail.com> | 2018-02-26 14:20:43 -0500 |
---|---|---|
committer | Andrew White <andrew.white@unboxed.co> | 2018-03-06 12:41:18 +0000 |
commit | a286c32cc0ccf253b495abe983ffffd5146153d3 (patch) | |
tree | 93d34c3192ebf2e5cd8d651da8f4f5486aa5c911 /activerecord/lib | |
parent | a3b7aa66bc81da96ea91019540e8874a76216cd8 (diff) | |
download | rails-a286c32cc0ccf253b495abe983ffffd5146153d3.tar.gz rails-a286c32cc0ccf253b495abe983ffffd5146153d3.tar.bz2 rails-a286c32cc0ccf253b495abe983ffffd5146153d3.zip |
Fix dependence on has_one/belongs_to relationships
When a class has a belongs_to or has_one relationship with dependent: :destroy
option enabled, objects of this class should not be deleted if it's dependents
cannot be deleted.
Example:
class Parent
has_one :child, dependent: :destroy
end
class Child
belongs_to :parent, inverse_of: :child
before_destroy { throw :abort }
end
c = Child.create
p = Parent.create(child: c)
p.destroy
p.destroyed? # expected: false; actual: true;
Fixes #32022
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/associations/belongs_to_association.rb | 10 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/has_one_association.rb | 1 |
2 files changed, 10 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index bd2012df84..1109fee462 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -5,7 +5,15 @@ module ActiveRecord # = Active Record Belongs To Association class BelongsToAssociation < SingularAssociation #:nodoc: def handle_dependency - target.send(options[:dependent]) if load_target + return unless load_target + + case options[:dependent] + when :destroy + target.destroy + raise ActiveRecord::Rollback unless target.destroyed? + else + target.send(options[:dependent]) + end end def replace(record) diff --git a/activerecord/lib/active_record/associations/has_one_association.rb b/activerecord/lib/active_record/associations/has_one_association.rb index 7953b89f61..090b082cb0 100644 --- a/activerecord/lib/active_record/associations/has_one_association.rb +++ b/activerecord/lib/active_record/associations/has_one_association.rb @@ -60,6 +60,7 @@ module ActiveRecord when :destroy target.destroyed_by_association = reflection target.destroy + throw(:abort) unless target.destroyed? when :nullify target.update_columns(reflection.foreign_key => nil) if target.persisted? end |