1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #14711 from swoker/activerecord_fix_aggregate_methods_with_select

Activerecord fix aggregate methods with select
This commit is contained in:
Rafael Mendonça França 2014-04-11 15:13:36 -03:00
commit d447eef20b
5 changed files with 35 additions and 3 deletions

View file

@ -289,4 +289,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.

View file

@ -8,7 +8,15 @@ module ActiveRecord
def proxy_association
@association
end
def size
@association.size
end
def empty?
@association.empty?
end
private
def exec_queries

View file

@ -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

View file

@ -1197,7 +1197,15 @@ class EagerAssociationTest < ActiveRecord::TestCase
author = Author.includes(:posts).references(:posts).reorder(:name).find_by('posts.title IS NOT NULL')
assert_equal authors(:bob), author
end
test "preloading with a polymorphic association and using the existential predicate but also using a select" do
assert_equal authors(:david), authors(:david).essays.includes(:writer).first.writer
assert_nothing_raised do
authors(:david).essays.includes(:writer).select(:name).any?
end
end
test "preloading with a polymorphic association and using the existential predicate" do
assert_equal authors(:david), authors(:david).essays.includes(:writer).first.writer

View file

@ -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)