Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add `:all` argument to `count` in `reset_counters`

Prior to this fix, if an association had a scope with a `select`,
calls to `reset_counters` would generate invalid SQL and throw:

ActiveRecord::StatementInvalid: [$DB_ADAPTER]: wrong number of
arguments to function COUNT()

References #10710, #13648
  • Loading branch information...
commit c8e48f08d528c0e4537bf1df1adac1fa8f4f48ff 1 parent beab403
@cade cade authored
View
5 activerecord/CHANGELOG.md
@@ -1,3 +1,8 @@
+* Fixed error in `reset_counters` when associations have `select` scope.
+ (Call to `count` generates invalid SQL.)
+
+ *Cade Truitt*
+
* PostgreSQL renaming table doesn't attempt to rename non existent sequences.
*Abdelkader Boudih*
View
2  activerecord/lib/active_record/counter_cache.rb
@@ -38,7 +38,7 @@ def reset_counters(id, *counters)
counter_name = reflection.counter_cache_column
stmt = unscoped.where(arel_table[primary_key].eq(object.id)).arel.compile_update({
- arel_table[counter_name] => object.send(counter_association).count
+ arel_table[counter_name] => object.send(counter_association).count(:all)
}, primary_key)
connection.update stmt
end
View
10 activerecord/test/cases/counter_cache_test.rb
@@ -19,6 +19,7 @@ class CounterCacheTest < ActiveRecord::TestCase
class ::SpecialTopic < ::Topic
has_many :special_replies, :foreign_key => 'parent_id'
+ has_many :lightweight_special_replies, -> { select('topics.id, topics.title') }, :foreign_key => 'parent_id', :class_name => 'SpecialReply'
end
class ::SpecialReply < ::Reply
@@ -170,4 +171,13 @@ class ::SpecialReply < ::Reply
end
assert_equal "'Topic' has no association called 'undefined_count'", e.message
end
+
+ test "reset counter works with select declared on association" do
+ special = SpecialTopic.create!(:title => 'Special')
+ SpecialTopic.increment_counter(:replies_count, special.id)
+
+ assert_difference 'special.reload.replies_count', -1 do
+ SpecialTopic.reset_counters(special.id, :lightweight_special_replies)
+ end
+ end
end
Please sign in to comment.
Something went wrong with that request. Please try again.