Permalink
Browse files

Merge pull request #10489 from greenriver/ar_counter_cache_multiple_d…

…estroy

Confirm a record has not already been destroyed before decrementing counter cache

Conflicts:
	activerecord/CHANGELOG.md

Conflicts:
	activerecord/CHANGELOG.md
	activerecord/lib/active_record/associations/builder/belongs_to.rb
  • Loading branch information...
1 parent 0b35a3a commit f8c4a31e0b35576c49cad16c12ebae270cdb0690 @rafaelfranca rafaelfranca committed May 7, 2013
@@ -1,5 +1,9 @@
## unreleased ##
+* Confirm a record has not already been destroyed before decrementing counter cache.
+
+ *Ben Tucker*
+
* Default values for PostgreSQL bigint types now get parsed and dumped to the
schema correctly.
Backport #10098.
@@ -34,7 +34,10 @@ def add_counter_cache_callbacks(reflection)
method_name = "belongs_to_counter_cache_before_destroy_for_#{name}"
mixin.redefine_method(method_name) do
record = send(name)
- record.class.decrement_counter(cache_column, record.id) unless record.nil?
+
+ if record && !self.destroyed?
+ record.class.decrement_counter(cache_column, record.id)
+ end
end
model.before_destroy(method_name)
@@ -387,6 +387,26 @@ def test_counter_cache
assert_equal 15, topic.replies.size
end
+ def test_counter_cache_double_destroy
+ topic = Topic.create :title => "Zoom-zoom-zoom"
+
+ 5.times do
+ topic.replies.create(:title => "re: zoom", :content => "speedy quick!")
+ end
+
+ assert_equal 5, topic.reload[:replies_count]
+ assert_equal 5, topic.replies.size
+
+ reply = topic.replies.first
+
+ reply.destroy
+ assert_equal 4, topic.reload[:replies_count]
+
+ reply.destroy
+ assert_equal 4, topic.reload[:replies_count]
+ assert_equal 4, topic.replies.size
+ end
+
def test_custom_counter_cache
reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
assert_equal 0, reply[:replies_count]

0 comments on commit f8c4a31

Please sign in to comment.