From afd4d8205e6a3264c30a29e4a2de0f1e71ef0717 Mon Sep 17 00:00:00 2001 From: Simon Woker Date: Thu, 10 Apr 2014 16:58:39 +0000 Subject: Fix error for aggregate methods with select, see issue #13648 --- activerecord/CHANGELOG.md | 7 +++++++ activerecord/lib/active_record/relation.rb | 5 ++--- activerecord/test/cases/relations_test.rb | 10 ++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) (limited to 'activerecord') diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index d39e808f5b..a23981a22b 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -264,4 +264,11 @@ *Yves Senn* +* Fixed error for aggregate methods (empty?, any?, count) with select() + which created invalid SQL + + Fixes #13648 + + *Simon Woker* + Please check [4-1-stable](https://github.com/rails/rails/blob/4-1-stable/activerecord/CHANGELOG.md) for previous changes. diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index 4d37ac6e2b..7cdae176a1 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -238,7 +238,7 @@ module ActiveRecord # Returns size of the records. def size - loaded? ? @records.length : count + loaded? ? @records.length : count(:all) end # Returns true if there are no records. @@ -248,8 +248,7 @@ module ActiveRecord if limit_value == 0 true else - # FIXME: This count is not compatible with #select('authors.*') or other select narrows - c = count + c = count(:all) c.respond_to?(:zero?) ? c.zero? : c.empty? end end diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb index 2aa6d643a5..da932b7663 100644 --- a/activerecord/test/cases/relations_test.rb +++ b/activerecord/test/cases/relations_test.rb @@ -824,6 +824,16 @@ class RelationTest < ActiveRecord::TestCase assert_raises(ActiveRecord::ActiveRecordError) { Author.limit(10).delete_all } end + def test_select_with_aggregates + posts = Post.select(:title, :body) + + assert_equal 11, posts.count(:all) + assert_equal 11, posts.size + assert posts.any? + assert posts.many? + assert ! posts.empty? + end + def test_select_takes_a_variable_list_of_args david = developers(:david) -- cgit v1.2.3