From 87898badba211540d9c1d4dae0cd513a9d525554 Mon Sep 17 00:00:00 2001 From: Jamis Buck Date: Thu, 9 Mar 2006 17:23:57 +0000 Subject: Allow counter_cache to accept a column name git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3825 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ activerecord/lib/active_record/associations.rb | 11 ++++++++--- activerecord/test/associations_test.rb | 22 +++++++++++++++++++++- .../test/fixtures/db_definitions/schema.rb | 20 ++++++++++---------- activerecord/test/fixtures/reply.rb | 1 + 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 9b25b543aa..760863de45 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow :counter_cache to take a column name for custom counter cache columns [Jamis Buck] + * Documentation fixes for :dependent [robby@planetargon.com] * Allow set_fixture_class to take Classes instead of strings for a class in a module. Raise FixtureClassNotFound if a fixture can't load. [Rick Olson] diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index b25df26059..a098c0f326 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -460,7 +460,8 @@ module ActiveRecord # * :counter_cache - caches the number of belonging objects on the associate class through use of increment_counter # and decrement_counter. The counter cache is incremented when an object of this class is created and decremented when it's # destroyed. This requires that a column named "#{table_name}_count" (such as comments_count for a belonging Comment class) - # is used on the associate class (such as a Post class). + # is used on the associate class (such as a Post class). You can also specify a custom counter cache column by given that + # name instead of a true/false value to this option (e.g., :counter_cache => :my_custom_counter.) # * :include - specify second-order associations that should be eager loaded when this object is loaded. # # Option examples: @@ -515,13 +516,17 @@ module ActiveRecord end if options[:counter_cache] + cache_column = options[:counter_cache] == true ? + "#{self.to_s.underscore.pluralize}_count" : + options[:counter_cache] + module_eval( - "after_create '#{reflection.name}.class.increment_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" + + "after_create '#{reflection.name}.class.increment_counter(\"#{cache_column}\", #{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})" + + "before_destroy '#{reflection.name}.class.decrement_counter(\"#{cache_column}\", #{reflection.primary_key_name})" + " unless #{reflection.name}.nil?'" ) end diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb index f687d3781e..8616c4d4ad 100755 --- a/activerecord/test/associations_test.rb +++ b/activerecord/test/associations_test.rb @@ -917,7 +917,27 @@ class BelongsToAssociationsTest < Test::Unit::TestCase assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # ' end - def xtest_counter_cache + def test_counter_cache + topic = Topic.create :title => "Zoom-zoom-zoom" + assert_equal 0, topic[:replies_count] + + reply = Reply.create(:title => "re: zoom", :content => "speedy quick!") + reply.topic = topic + + assert_equal 1, topic.reload[:replies_count] + end + + def test_custom_counter_cache + reply = Reply.create(:title => "re: zoom", :content => "speedy quick!") + assert_equal 0, reply[:replies_count] + + silly = SillyReply.create(:title => "gaga", :content => "boo-boo") + silly.reply = reply + + assert_equal 1, reply.reload[:replies_count] + end + + def xtest_size_uses_counter_cache apple = Firm.create("name" => "Apple") final_cut = apple.clients.create("name" => "Final Cut") diff --git a/activerecord/test/fixtures/db_definitions/schema.rb b/activerecord/test/fixtures/db_definitions/schema.rb index f2e9eacb08..53aa7c1967 100644 --- a/activerecord/test/fixtures/db_definitions/schema.rb +++ b/activerecord/test/fixtures/db_definitions/schema.rb @@ -1,20 +1,20 @@ ActiveRecord::Schema.define do - create_table "taggings", :force => true do |t| - t.column "tag_id", :integer - t.column "taggable_type", :string - t.column "taggable_id", :integer + create_table :taggings, :force => true do |t| + t.column :tag_id, :integer + t.column :taggable_type, :string + t.column :taggable_id, :integer end - create_table "tags", :force => true do |t| - t.column "name", :string + 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| - t.column "category_id", :integer - t.column "post_id", :integer - t.column "author_id", :integer + create_table :categorizations, :force => true do |t| + t.column :category_id, :integer + t.column :post_id, :integer + t.column :author_id, :integer end add_column :posts, :taggings_count, :integer, :default => 0 diff --git a/activerecord/test/fixtures/reply.rb b/activerecord/test/fixtures/reply.rb index ed22deaa74..04a50e9322 100755 --- a/activerecord/test/fixtures/reply.rb +++ b/activerecord/test/fixtures/reply.rb @@ -33,4 +33,5 @@ class Reply < Topic end class SillyReply < Reply + belongs_to :reply, :foreign_key => "parent_id", :counter_cache => :replies_count end -- cgit v1.2.3