Permalink
Browse files

Foo.joins(:bar).includes(:bar) should result in a single query with :…

…bar as a join. Related: #1873.
  • Loading branch information...
jonleighton committed Jul 9, 2011
1 parent 7a8b0ec commit ca94acf0be2428273a432bd58f38ab1d0dcb1ed7
Showing with 19 additions and 1 deletion.
  1. +11 −1 activerecord/lib/active_record/relation.rb
  2. +8 −0 activerecord/test/cases/associations/eager_test.rb
@@ -409,7 +409,17 @@ def scope_for_create
end
def eager_loading?
- @should_eager_load ||= (@eager_load_values.any? || (@includes_values.any? && references_eager_loaded_tables?))
+ @should_eager_load ||=
+ @eager_load_values.any? ||
+ @includes_values.any? && (joined_includes_values.any? || references_eager_loaded_tables?)
+ end
+
+ # Joins that are also marked for preloading. In which case we should just eager load them.
+ # Note that this is a naive implementation because we could have strings and symbols which
+ # represent the same association, but that aren't matched by this. Also, we could have
+ # nested hashes which partially match, e.g. { :a => :b } & { :a => [:b, :c] }
+ def joined_includes_values
+ @includes_values & @joins_values
end
def ==(other)
@@ -1040,4 +1040,12 @@ def test_preloading_polymorphic_with_custom_foreign_type
}
assert_no_queries { assert_equal groucho, sponsor.thing }
end
+
+ def test_joins_with_includes_should_preload_via_joins
+ post = assert_queries(1) { Post.includes(:comments).joins(:comments).order('posts.id desc').to_a.first }
+
+ assert_queries(0) do
+ assert_not_equal 0, post.comments.to_a.count
+ end
+ end
end

0 comments on commit ca94acf

Please sign in to comment.