Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
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...
commit dbb7ee1bfd16d9aabd3b3ed1a566c8752e9af3c0 1 parent b31b6e6
@dm1try dm1try authored
View
7 activerecord/CHANGELOG.md
@@ -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`.
View
2  activerecord/lib/active_record/associations/has_many_through_association.rb
@@ -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
View
9 activerecord/test/cases/associations/has_many_through_associations_test.rb
@@ -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)}
Please sign in to comment.
Something went wrong with that request. Please try again.