aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Mileham <jmileham@gmail.com>2011-03-24 15:09:24 -0400
committerJohn Mileham <jmileham@gmail.com>2011-03-24 15:09:24 -0400
commit28c73f012328c8386acfc608f0dfb1a459dbf170 (patch)
tree95f78cfe8f8ac57b042a2a8b2b18049c5703c3d6
parentb44a0ec153c84384e9b97a069e81f28bc5c2a4bf (diff)
downloadrails-28c73f012328c8386acfc608f0dfb1a459dbf170.tar.gz
rails-28c73f012328c8386acfc608f0dfb1a459dbf170.tar.bz2
rails-28c73f012328c8386acfc608f0dfb1a459dbf170.zip
Use Arel to build subquery. Adapt tests to changed fixtures.
-rw-r--r--activerecord/lib/active_record/relation/calculations.rb25
-rw-r--r--activerecord/test/cases/relations_test.rb6
2 files changed, 15 insertions, 16 deletions
diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb
index 7bfeb20a2b..869eebfa34 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -183,13 +183,10 @@ module ActiveRecord
end
end
- def aggregate_column(column_name, subquery_alias = nil)
+ def aggregate_column(column_name)
if @klass.column_names.include?(column_name.to_s)
- Arel::Attribute.new(subquery_alias || @klass.unscoped.table, column_name)
+ Arel::Attribute.new(@klass.unscoped.table, column_name)
else
- if subquery_alias && (split_name = column_name.to_s.split(".")).length > 1
- column_name = split_name.last
- end
Arel.sql(column_name == :all ? "*" : column_name.to_s)
end
end
@@ -315,14 +312,16 @@ module ActiveRecord
end
def build_count_subquery(relation, column_name, distinct)
- # Arel doesn't do subqueries
- subquery_alias = arel_table.alias("subquery_for_count")
- aliased_column = aggregate_column(column_name, subquery_alias)
- select_value = operation_over_aggregate_column(aliased_column, 'count', distinct)
-
- relation.select_values = [(column_name == :all ? 1 : aggregate_column(column_name))]
- subquery_sql = "(#{relation.arel.to_sql}) #{subquery_alias.name}"
- subquery_alias.relation.select_manager.project(select_value).from(subquery_sql)
+ column_alias = Arel.sql('count_column')
+ subquery_alias = Arel.sql('subquery_for_count')
+
+ aliased_column = aggregate_column(column_name == :all ? 1 : column_name).as(column_alias)
+ relation.select_values = [aliased_column]
+ subquery = relation.arel.as(subquery_alias)
+
+ sm = Arel::SelectManager.new relation.engine
+ select_value = operation_over_aggregate_column(column_alias, 'count', distinct)
+ sm.project(select_value).from(subquery)
end
end
end
diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb
index dad6665990..dfb5735b5d 100644
--- a/activerecord/test/cases/relations_test.rb
+++ b/activerecord/test/cases/relations_test.rb
@@ -667,14 +667,14 @@ class RelationTest < ActiveRecord::TestCase
end
def test_size_with_limit
- posts = Post.limit(6)
+ posts = Post.limit(10)
- assert_queries(1) { assert_equal 6, posts.size }
+ assert_queries(1) { assert_equal 10, posts.size }
assert ! posts.loaded?
best_posts = posts.where(:comments_count => 0)
best_posts.to_a # force load
- assert_no_queries { assert_equal 5, best_posts.size }
+ assert_no_queries { assert_equal 9, best_posts.size }
end
def test_size_with_zero_limit