From 9a535c16ca1ecc6d9761efb5900c31c77196aaf0 Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Sat, 26 Jun 2010 22:51:07 -0400 Subject: [PATCH] 4984_partial_fix --- activerecord/lib/active_record/counter_cache.rb | 6 ++++-- activerecord/test/cases/counter_cache_test.rb | 15 ++++++++++++--- activerecord/test/fixtures/cars.yml | 4 ++++ activerecord/test/models/car.rb | 3 +++ activerecord/test/models/engine.rb | 3 +++ activerecord/test/schema/schema.rb | 8 ++++++++ 6 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 activerecord/test/fixtures/cars.yml create mode 100644 activerecord/test/models/car.rb create mode 100644 activerecord/test/models/engine.rb diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb index 9993221..2f98c87 100644 --- a/activerecord/lib/active_record/counter_cache.rb +++ b/activerecord/lib/active_record/counter_cache.rb @@ -18,7 +18,9 @@ module ActiveRecord object = find(id) counters.each do |association| child_class = reflect_on_association(association.to_sym).klass - belongs_name = self.name.demodulize.underscore.to_sym + belongs_to = child_class.reflect_on_all_associations(:belongs_to) + belongs_to_association = belongs_to.detect {|e| e.class_name == self.name } + belongs_name = belongs_to_association.name counter_name = child_class.reflect_on_association(belongs_name).counter_cache_column self.unscoped.where(arel_table[self.primary_key].eq(object.id)).arel.update({ @@ -103,4 +105,4 @@ module ActiveRecord update_counters(id, counter_name => -1) end end -end \ No newline at end of file +end diff --git a/activerecord/test/cases/counter_cache_test.rb b/activerecord/test/cases/counter_cache_test.rb index 377de16..1155a5d 100644 --- a/activerecord/test/cases/counter_cache_test.rb +++ b/activerecord/test/cases/counter_cache_test.rb @@ -1,17 +1,19 @@ require 'cases/helper' require 'models/topic' +require 'models/car' +require 'models/engine' require 'models/reply' require 'models/category' require 'models/categorization' class CounterCacheTest < ActiveRecord::TestCase - fixtures :topics, :categories, :categorizations + fixtures :topics, :categories, :categorizations, :cars - class SpecialTopic < ::Topic + class ::SpecialTopic < ::Topic has_many :special_replies, :foreign_key => 'parent_id' end - class SpecialReply < ::Reply + class ::SpecialReply < ::Reply belongs_to :special_topic, :foreign_key => 'parent_id', :counter_cache => 'replies_count' end @@ -58,6 +60,13 @@ class CounterCacheTest < ActiveRecord::TestCase end end + test "reset counter should with belongs_to which has class_name" do + car = cars(:honda) + assert_nothing_raised do + Car.reset_counters(car.id, :engines) + end + end + test "update counter with initial null value" do category = categories(:general) assert_equal 2, category.categorizations.count diff --git a/activerecord/test/fixtures/cars.yml b/activerecord/test/fixtures/cars.yml new file mode 100644 index 0000000..23c98e8 --- /dev/null +++ b/activerecord/test/fixtures/cars.yml @@ -0,0 +1,4 @@ +honda: + id: 1 + name: honda + engines_count: 0 diff --git a/activerecord/test/models/car.rb b/activerecord/test/models/car.rb new file mode 100644 index 0000000..5c2323c --- /dev/null +++ b/activerecord/test/models/car.rb @@ -0,0 +1,3 @@ +class Car < ActiveRecord::Base + has_many :engines +end diff --git a/activerecord/test/models/engine.rb b/activerecord/test/models/engine.rb new file mode 100644 index 0000000..751c3f0 --- /dev/null +++ b/activerecord/test/models/engine.rb @@ -0,0 +1,3 @@ +class Engine < ActiveRecord::Base + belongs_to :my_car, :class_name => 'Car', :foreign_key => 'car_id', :counter_cache => :engines_count +end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index b212e7c..797582e 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -82,6 +82,11 @@ ActiveRecord::Schema.define do t.string :name end + create_table :cars, :force => true do |t| + t.string :name + t.integer :engines_count + end + create_table :categories, :force => true do |t| t.string :name, :null => false t.string :type @@ -179,6 +184,9 @@ ActiveRecord::Schema.define do end add_index :edges, [:source_id, :sink_id], :unique => true, :name => 'unique_edge_index' + create_table :engines, :force => true do |t| + t.integer :car_id + end create_table :entrants, :force => true do |t| t.string :name, :null => false -- 1.6.5.2