aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/associations.rb24
-rw-r--r--activerecord/test/associations_join_model_test.rb8
-rw-r--r--activerecord/test/fixtures/db_definitions/schema.rb3
-rw-r--r--activerecord/test/fixtures/tagging.rb2
5 files changed, 26 insertions, 13 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index d2d4c08b5e..bf4dc24f5b 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Make counter_cache work with polymorphic belongs_to [Jamis Buck]
+
* Fixed that calling HasOneProxy#build_model repeatedly would cause saving to happen #4058 [anna@wota.jp]
* Added Sybase database adapter that relies on the Sybase Open Client bindings (see http://raa.ruby-lang.org/project/sybase-ctlib) #3765 [John Sheets]. It's almost completely Active Record compliant, but has the following caveats:
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index 0c7e647628..f841d50288 100755
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -506,22 +506,22 @@ module ActiveRecord
EOF
end
- if options[:counter_cache]
- module_eval(
- "after_create '#{reflection.class_name}.increment_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
- " unless #{reflection.name}.nil?'"
- )
-
- module_eval(
- "before_destroy '#{reflection.class_name}.decrement_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
- " unless #{reflection.name}.nil?'"
- )
- end
-
# deprecated api
deprecated_has_association_method(reflection.name)
deprecated_association_comparison_method(reflection.name, reflection.class_name)
end
+
+ if options[:counter_cache]
+ module_eval(
+ "after_create '#{reflection.name}.class.increment_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
+ " unless #{reflection.name}.nil?'"
+ )
+
+ module_eval(
+ "before_destroy '#{reflection.name}.class.decrement_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
+ " unless #{reflection.name}.nil?'"
+ )
+ end
end
# Associates two classes via an intermediate join table. Unless the join table is explicitly specified as
diff --git a/activerecord/test/associations_join_model_test.rb b/activerecord/test/associations_join_model_test.rb
index f7ca3d6a84..a2f42f060e 100644
--- a/activerecord/test/associations_join_model_test.rb
+++ b/activerecord/test/associations_join_model_test.rb
@@ -104,4 +104,12 @@ class AssociationsJoinModelTest < Test::Unit::TestCase
assert_equal [], posts(:thinking).authors
assert_equal [authors(:mary)], posts(:authorless).authors
end
+
+ def test_belongs_to_polymorphic_with_counter_cache
+ assert_equal 0, posts(:welcome)[:taggings_count]
+ tagging = posts(:welcome).taggings.create(:tag => tags(:general))
+ assert_equal 1, posts(:welcome, :reload)[:taggings_count]
+ tagging.destroy
+ assert posts(:welcome, :reload)[:taggings_count].zero?
+ end
end
diff --git a/activerecord/test/fixtures/db_definitions/schema.rb b/activerecord/test/fixtures/db_definitions/schema.rb
index 1cf4dee7a5..f2e9eacb08 100644
--- a/activerecord/test/fixtures/db_definitions/schema.rb
+++ b/activerecord/test/fixtures/db_definitions/schema.rb
@@ -8,6 +8,7 @@ ActiveRecord::Schema.define do
create_table "tags", :force => true do |t|
t.column "name", :string
+ t.column :taggings_count, :integer, :default => 0
end
create_table "categorizations", :force => true do |t|
@@ -16,4 +17,6 @@ ActiveRecord::Schema.define do
t.column "author_id", :integer
end
+ add_column :posts, :taggings_count, :integer, :default => 0
+
end \ No newline at end of file
diff --git a/activerecord/test/fixtures/tagging.rb b/activerecord/test/fixtures/tagging.rb
index 06d0144b5a..8bc844c370 100644
--- a/activerecord/test/fixtures/tagging.rb
+++ b/activerecord/test/fixtures/tagging.rb
@@ -1,4 +1,4 @@
class Tagging < ActiveRecord::Base
belongs_to :tag
- belongs_to :taggable, :polymorphic => true
+ belongs_to :taggable, :polymorphic => true, :counter_cache => true
end \ No newline at end of file