From 8df6e7d4139c585b96d8b1ea07dd11966b2634ab Mon Sep 17 00:00:00 2001 From: Rein de Lange Date: Wed, 25 Jun 2025 11:03:44 +0200 Subject: [PATCH] 149 Fix incorrect counter_cache value on dup of associations with counter_cache Resolves #149 --- lib/deep_cloneable/deep_clone.rb | 1 + test/models.rb | 2 +- test/schema.rb | 1 + test/test_deep_cloneable.rb | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/deep_cloneable/deep_clone.rb b/lib/deep_cloneable/deep_clone.rb index 4acf5a4..ca94437 100644 --- a/lib/deep_cloneable/deep_clone.rb +++ b/lib/deep_cloneable/deep_clone.rb @@ -85,6 +85,7 @@ def deep_clone(*args, &block) &block ) + kopy[association_reflection.counter_cache_column] = 0 if association_reflection.has_cached_counter? kopy.send("#{association}=", duped_object) elsif !options[:skip_missing_associations] raise ::DeepCloneable::AssociationNotFoundException, "#{self.class}##{association}" diff --git a/test/models.rb b/test/models.rb index 6296e5c..9ced31e 100644 --- a/test/models.rb +++ b/test/models.rb @@ -25,7 +25,7 @@ class Dove < Bird end class Planet < ActiveRecord::Base - has_many :birds + has_many :birds, :counter_cache => :birds_count end class Ownership < ActiveRecord::Base diff --git a/test/schema.rb b/test/schema.rb index f023cc0..209d498 100644 --- a/test/schema.rb +++ b/test/schema.rb @@ -51,6 +51,7 @@ create_table :planets, :force => true do |t| t.column :name, :string + t.column :birds_count, :integer, :default => 0, :null => false end create_table :birds, :force => true do |t| diff --git a/test/test_deep_cloneable.rb b/test/test_deep_cloneable.rb index d04954b..9efa331 100644 --- a/test/test_deep_cloneable.rb +++ b/test/test_deep_cloneable.rb @@ -253,6 +253,20 @@ def test_should_skip_missing_associations assert deep_clone_earth.birds.detect { |bird| bird.is_a?(Animal::Chicken) }.ownerships.any? end + def test_should_reset_counter_cache + @earth = Animal::Planet.create :name => 'Earth' + + assert_equal 0, @earth.birds_count + + @dove1 = @earth.birds.create!(:name => 'Dovey 1') + @dove2 = @earth.birds.create!(:name => 'Dovey 2') + + assert_equal 2, @earth.birds_count + + deep_clone_earth = @earth.deep_clone(:include => :birds) + assert_equal 2, deep_clone_earth.birds_count + end + def test_should_deep_clone_with_block deep_clone = @jack.deep_clone(:include => :parrot) do |original, kopy| kopy.cloned_from_id = original.id