diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb index 3aef1b2..49eb0b0 100644 --- a/activerecord/lib/active_record/associations/association_collection.rb +++ b/activerecord/lib/active_record/associations/association_collection.rb @@ -166,7 +166,10 @@ module ActiveRecord # Otherwise, construct options and pass them with scope to the target class's +count+. def count(*args) if @reflection.options[:counter_sql] - @reflection.klass.count_by_sql(@counter_sql) + conditions = sanitize_sql(args.last.is_a?(Hash) ? args.last[:conditions] : nil) + sql = @counter_sql + sql << " AND (#{conditions})" unless conditions.blank? + @reflection.klass.count_by_sql(sql) else column_name, options = @reflection.klass.send(:construct_count_options_from_args, *args) if @reflection.options[:uniq] diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index 30edf79..507e534 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -28,6 +28,10 @@ class HasManyAssociationsTest < ActiveRecord::TestCase assert_equal 2, Firm.find(:first).clients.count end + def test_counting_with_conditional_counter_sql + assert_equal 1, Firm.find(:first).clients.count(:conditions => ['name = ?', 'Microsoft']) + end + def test_counting assert_equal 2, Firm.find(:first).plain_clients.count end