aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/base.rb10
-rwxr-xr-xactiverecord/test/associations_test.rb4
-rwxr-xr-xactiverecord/test/fixtures/company.rb3
4 files changed, 17 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 593d1c806d..8206d673da 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fixed counter_sql when no records exist in database for PostgreSQL (would give error, not 0) #1039 [Caleb Tennis]
+
* Fixed that benchmarking times for rendering included db runtimes #987 [skaes@web.de]
* Fixed boolean queries for t/f fields in PostgreSQL #995 [dave@cherryville.org]
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index b4f1b3ba73..c27bcecdd6 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -426,8 +426,14 @@ module ActiveRecord #:nodoc:
# Product.count "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
def count_by_sql(sql)
sql = sanitize_conditions(sql)
- count = connection.select_one(sql, "#{name} Count").values.first
- return count ? count.to_i : 0
+ rows = connection.select_one(sql, "#{name} Count")
+
+ if rows.nil?
+ return 0
+ else
+ count = rows.values.first
+ return count ? count.to_i : 0
+ end
end
# Increments the specified counter by one. So <tt>DiscussionBoard.increment_counter("post_count",
diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb
index cd9fa7cb18..71e2ab01f8 100755
--- a/activerecord/test/associations_test.rb
+++ b/activerecord/test/associations_test.rb
@@ -250,6 +250,10 @@ class HasManyAssociationsTest < Test::Unit::TestCase
assert_equal 1, Firm.find_first.clients_using_counter_sql.size
assert_equal 0, Firm.find_first.clients_using_zero_counter_sql.size
end
+
+ def test_counting_non_existant_items_using_sql
+ assert_equal 0, Firm.find_first.no_clients_using_counter_sql.size
+ end
def test_belongs_to_sanity
c = Client.new
diff --git a/activerecord/test/fixtures/company.rb b/activerecord/test/fixtures/company.rb
index 17a71e7e20..d4bdd7982e 100755
--- a/activerecord/test/fixtures/company.rb
+++ b/activerecord/test/fixtures/company.rb
@@ -17,6 +17,9 @@ class Firm < Company
has_many :clients_using_zero_counter_sql, :class_name => "Client",
:finder_sql => 'SELECT * FROM companies WHERE client_of = #{id}',
:counter_sql => 'SELECT 0 FROM companies WHERE client_of = #{id}'
+ has_many :no_clients_using_counter_sql, :class_name => "Client",
+ :finder_sql => 'SELECT * FROM companies WHERE client_of = 1000',
+ :counter_sql => 'SELECT COUNT(*) FROM companies WHERE client_of = 1000'
has_one :account, :dependent => true
end