aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorFernando Gorodscy <fegorodscy@gmail.com>2018-02-26 14:20:43 -0500
committerAndrew White <andrew.white@unboxed.co>2018-03-06 12:41:18 +0000
commita286c32cc0ccf253b495abe983ffffd5146153d3 (patch)
tree93d34c3192ebf2e5cd8d651da8f4f5486aa5c911 /activerecord/lib
parenta3b7aa66bc81da96ea91019540e8874a76216cd8 (diff)
downloadrails-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.rb10
-rw-r--r--activerecord/lib/active_record/associations/has_one_association.rb1
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