Permalink
Browse files

Prevent the counter cache from being decremented twice

when destroying a record on a has_many :through association.
:destroy method has own counter_cache callbacks.
  • Loading branch information...
1 parent b31b6e6 commit dbb7ee1bfd16d9aabd3b3ed1a566c8752e9af3c0 @dm1try dm1try committed Nov 11, 2013
@@ -1,3 +1,10 @@
+* Prevent the counter cache from being decremented twice when destroying
+ a record on a has_many :through association.
+
+ Fixes #11079.
+
+ *Dmitry Dedov*
+
* Unify boolean type casting for `MysqlAdapter` and `Mysql2Adapter`.
`type_cast` will return `1` for `true` and `0` for `false`.
@@ -163,7 +163,7 @@ def delete_records(records, method)
delete_through_records(records)
- if source_reflection.options[:counter_cache]
+ if source_reflection.options[:counter_cache] && method != :destroy
counter = source_reflection.counter_cache_column
klass.decrement_counter counter, records.map(&:id)
end
@@ -514,6 +514,15 @@ def test_update_counter_caches_on_replace_association
assert_equal(post.taggings.count, post.taggings_count)
end
+ def test_update_counter_caches_on_destroy
+ post = posts(:welcome)
+ tag = post.tags.create!(name: 'doomed')
+
+ assert_difference 'post.reload.taggings_count', -1 do
+ tag.tagged_posts.destroy(post)
+ end
+ end
+
def test_replace_association
assert_queries(4){posts(:welcome);people(:david);people(:michael); posts(:welcome).people(true)}

0 comments on commit dbb7ee1

Please sign in to comment.