diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 3f8ec4d..a859db8 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1039,7 +1039,7 @@ module ActiveRecord method_name = "belongs_to_counter_cache_before_destroy_for_#{reflection.name}".to_sym define_method(method_name) do association = send(reflection.name) - association.class.decrement_counter(cache_column, send(reflection.primary_key_name)) unless association.nil? + association.class.decrement_counter(cache_column, send(reflection.primary_key_name)) unless association.nil? || !@affected_rows_destroy.blank? end before_destroy method_name diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 69ea155..b4e5008 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2326,7 +2326,7 @@ module ActiveRecord #:nodoc: # be made (since they can't be persisted). def destroy unless new_record? - connection.delete <<-end_sql, "#{self.class.name} Destroy" + @affected_rows_destroy = connection.delete <<-end_sql, "#{self.class.name} Destroy" DELETE FROM #{self.class.quoted_table_name} WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quoted_id} end_sql diff --git a/activerecord/test/cases/associations_test.rb b/activerecord/test/cases/associations_test.rb index cde451d..69b81fb 100644 --- a/activerecord/test/cases/associations_test.rb +++ b/activerecord/test/cases/associations_test.rb @@ -26,8 +26,8 @@ require 'models/membership' require 'models/sponsor' class AssociationsTest < ActiveRecord::TestCase - fixtures :accounts, :companies, :developers, :projects, :developers_projects, - :computers, :people, :readers + fixtures :accounts, :comments, :companies, :developers, :projects, :developers_projects, + :computers, :people, :posts, :readers def test_include_with_order_works assert_nothing_raised {Account.find(:first, :order => 'id', :include => :firm)} @@ -84,6 +84,21 @@ class AssociationsTest < ActiveRecord::TestCase assert_equal "Natural Company", db["apple"].clients.first.name end end + + def test_destroy_counter_cache_concurrency + p = posts(:welcome) + + comments_count_old = p.comments_count + + c = Comment.new(:body => 'Comment', :type => 'Comment') + p.comments << c + + c.destroy + c.destroy + p.reload + + assert_equal comments_count_old, p.comments_count + end end class AssociationProxyTest < ActiveRecord::TestCase