diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 6d25b36..5ec55f9 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1565,15 +1565,30 @@ module ActiveRecord sql = "SELECT #{column_aliases(join_dependency)} FROM #{(scope && scope[:from]) || options[:from] || quoted_table_name} " sql << join_dependency.join_associations.collect{|join| join.association_join }.join - add_joins!(sql, options[:joins], scope) - add_conditions!(sql, options[:conditions], scope) - add_limited_ids_condition!(sql, options, join_dependency) if !using_limitable_reflections?(join_dependency.reflections) && ((scope && scope[:limit]) || options[:limit]) + recursively_scope = Proc.new do |scopes| + if scope = scopes.pop + with_scope(:find => scope) do + recursively_scope.call(scopes) + end + else + scope = scope(:find) - add_group!(sql, options[:group], options[:having], scope) - add_order!(sql, options[:order], scope) - add_limit!(sql, options, scope) if using_limitable_reflections?(join_dependency.reflections) - add_lock!(sql, options, scope) + add_joins!(sql, options[:joins], scope) + add_conditions!(sql, options[:conditions], scope) + add_limited_ids_condition!(sql, options, join_dependency) if !using_limitable_reflections?(join_dependency.reflections) && ((scope && scope[:limit]) || options[:limit]) + + add_group!(sql, options[:group], options[:having], scope) + add_order!(sql, options[:order], scope) + add_limit!(sql, options, scope) if using_limitable_reflections?(join_dependency.reflections) + add_lock!(sql, options, scope) + end + end + + scopes = join_dependency.join_associations.map(&:klass).map do |klass| + klass.scope(:find) + end.compact + recursively_scope.call(scopes) return sanitize_sql(sql) end diff --git a/activerecord/test/cases/associations/eager_test.rb b/activerecord/test/cases/associations/eager_test.rb index 0f53cd2..32c9041 100644 --- a/activerecord/test/cases/associations/eager_test.rb +++ b/activerecord/test/cases/associations/eager_test.rb @@ -792,6 +792,11 @@ class EagerAssociationTest < ActiveRecord::TestCase Project.find(1, :include => :ordered_by_salary_developers).ordered_by_salary_developers end + def test_non_preload_non_self_referential_association_obeys_scope + assert_equal Project.find(1).ordered_by_salary_developers, + Project.find(1, :include => :ordered_by_salary_developers, :conditions => 'developers.salary > 0').ordered_by_salary_developers + end + def test_preload_has_many_using_primary_key expected = Firm.find(:first).clients_using_primary_key.to_a firm = Firm.find :first, :include => :clients_using_primary_key