From 1e53404fe9c39ad0849894d73e431315be8c0bf0 Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Sun, 27 Jun 2010 11:17:44 -0400 Subject: reset_counter should work with non-traditional belongs_to and polymorphic belongs_to MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [#4984 state:resolved] Signed-off-by: José Valim --- activerecord/lib/active_record/counter_cache.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb index 999322129a..808e70d7de 100644 --- a/activerecord/lib/active_record/counter_cache.rb +++ b/activerecord/lib/active_record/counter_cache.rb @@ -17,8 +17,14 @@ module ActiveRecord def reset_counters(id, *counters) object = find(id) counters.each do |association| - child_class = reflect_on_association(association.to_sym).klass - belongs_name = self.name.demodulize.underscore.to_sym + has_many_association = reflect_on_association(association.to_sym) + polymorphic_class = has_many_association.options[:as] + child_class = has_many_association.klass + belongs_to = child_class.reflect_on_all_associations(:belongs_to) + belongs_to_association = belongs_to.detect do |e| + polymorphic_class.nil? ? (e.class_name == self.name) : (e.class_name.to_s.downcase == polymorphic_class.to_s.downcase) + end + 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 +109,4 @@ module ActiveRecord update_counters(id, counter_name => -1) end end -end \ No newline at end of file +end -- cgit v1.2.3