aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/lib/active_record/associations.rb16
-rw-r--r--activerecord/test/cases/finder_test.rb9
2 files changed, 21 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index fb5f1f8a8c..7862f8ad9d 100644
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -1500,6 +1500,12 @@ module ActiveRecord
order.scan(/([\.\w]+).?\./).flatten
end
+ def selects_tables(options)
+ select = options[:select]
+ return [] unless select && select.is_a?(String)
+ select.scan(/"?([\.\w]+)"?.?\./).flatten
+ end
+
# Checks if the conditions reference a table other than the current model table
def include_eager_conditions?(options,tables = nil)
tables = conditions_tables(options)
@@ -1518,8 +1524,16 @@ module ActiveRecord
end
end
+ def include_eager_select?(options)
+ selects = selects_tables(options)
+ return false unless selects.any?
+ selects.any? do |select|
+ select != table_name
+ end
+ end
+
def references_eager_loaded_tables?(options)
- include_eager_order?(options) || include_eager_conditions?(options)
+ include_eager_order?(options) || include_eager_conditions?(options) || include_eager_select?(options)
end
def using_limitable_reflections?(reflections)
diff --git a/activerecord/test/cases/finder_test.rb b/activerecord/test/cases/finder_test.rb
index 2acfe9b387..d3e2f33f99 100644
--- a/activerecord/test/cases/finder_test.rb
+++ b/activerecord/test/cases/finder_test.rb
@@ -859,12 +859,15 @@ class FinderTest < ActiveRecord::TestCase
end
def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
- assert_equal 2, Post.find(:all,:include=>{:authors=>:author_address},:order=>' author_addresses.id DESC ', :limit=>2).size
+ assert_equal 2, Post.find(:all, :include => { :authors => :author_address }, :order => ' author_addresses.id DESC ', :limit => 2).size
- assert_equal 3, Post.find(:all,:include=>{:author=>:author_address,:authors=>:author_address},
- :order=>' author_addresses_authors.id DESC ', :limit=>3).size
+ assert_equal 3, Post.find(:all, :include => { :author => :author_address, :authors => :author_address},
+ :order => ' author_addresses_authors.id DESC ', :limit => 3).size
end
+ def test_with_limiting_with_custom_select
+ assert_equal 3, Post.find(:all, :include => :author, :select => ' posts.*, authors.id as "author_id"', :limit => 3).size
+ end
protected
def bind(statement, *vars)