aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2013-03-15 11:22:01 +0100
committerYves Senn <yves.senn@gmail.com>2013-03-15 11:22:01 +0100
commitb601399b72ab56cc01368f02615af99f45d14f02 (patch)
treebe99d39ad7a99fd103f9625e2429111b1f8c2e1b /activerecord
parentddb9040b433b00aa0206442aa718eee12bceb517 (diff)
downloadrails-b601399b72ab56cc01368f02615af99f45d14f02.tar.gz
rails-b601399b72ab56cc01368f02615af99f45d14f02.tar.bz2
rails-b601399b72ab56cc01368f02615af99f45d14f02.zip
`#reset_counters` verifies counter names.
Closes #9724. Raise an `ArgumentError` when the name of the counter does not match an association name.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/counter_cache.rb3
-rw-r--r--activerecord/test/cases/counter_cache_test.rb7
2 files changed, 9 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb
index 81f92db271..81cca37939 100644
--- a/activerecord/lib/active_record/counter_cache.rb
+++ b/activerecord/lib/active_record/counter_cache.rb
@@ -11,7 +11,7 @@ module ActiveRecord
# ==== Parameters
#
# * +id+ - The id of the object you wish to reset a counter on.
- # * +counters+ - One or more counter names to reset
+ # * +counters+ - One or more association counters to reset
#
# ==== Examples
#
@@ -21,6 +21,7 @@ module ActiveRecord
object = find(id)
counters.each do |association|
has_many_association = reflect_on_association(association.to_sym)
+ raise ArgumentError, "'#{self.name}' has no association called '#{association}'" unless has_many_association
if has_many_association.is_a? ActiveRecord::Reflection::ThroughReflection
has_many_association = has_many_association.through_reflection
diff --git a/activerecord/test/cases/counter_cache_test.rb b/activerecord/test/cases/counter_cache_test.rb
index fc46a249c8..7de2ceae88 100644
--- a/activerecord/test/cases/counter_cache_test.rb
+++ b/activerecord/test/cases/counter_cache_test.rb
@@ -131,4 +131,11 @@ class CounterCacheTest < ActiveRecord::TestCase
Subscriber.reset_counters(subscriber.id, 'books')
end
end
+
+ test "the passed symbol needs to be an association name" do
+ e = assert_raises(ArgumentError) do
+ Topic.reset_counters(@topic.id, :replies_count)
+ end
+ assert_equal "'Topic' has no association called 'replies_count'", e.message
+ end
end