Permalink
Browse files

Handle preloads and eager loads when merging relations

  • Loading branch information...
lifo committed Dec 27, 2009
1 parent a8b10a2 commit 51a1d5a6708726ae03deb5869f36e7d5cca22a6e
Showing with 22 additions and 4 deletions.
  1. +4 −2 activerecord/lib/active_record/relation.rb
  2. +18 −2 activerecord/test/cases/relations_test.rb
@@ -2,7 +2,7 @@ module ActiveRecord
class Relation
delegate :to_sql, :to => :relation
delegate :length, :collect, :find, :map, :each, :to => :to_a
- attr_reader :relation, :klass
+ attr_reader :relation, :klass, :associations_to_preload, :eager_load_associations
def initialize(klass, relation, readonly = false, preload = [], eager_load = [])
@klass, @relation = klass, relation
@@ -19,7 +19,9 @@ def merge(r)
where(r.send(:where_clause)).
limit(r.taken).
offset(r.skipped).
- select(r.send(:select_clauses).join(', '))
+ select(r.send(:select_clauses).join(', ')).
+ eager_load(r.eager_load_associations).
+ preload(r.associations_to_preload)
end
alias :& :merge
@@ -332,8 +332,24 @@ def test_relation_merging
devs = Developer.where("salary >= 80000") & Developer.limit(2) & Developer.order('id ASC').where("id < 3")
assert_equal [developers(:david), developers(:jamis)], devs.to_a
- dev_with_count = Developer.limit(1) & Developer.order('id DESC') & Developer.select('developers.*, count(id) id_count').group('id')
+ dev_with_count = Developer.limit(1) & Developer.order('id DESC') & Developer.select('developers.*').group('id')
assert_equal [developers(:poor_jamis)], dev_with_count.to_a
- assert_equal 1, dev_with_count.first.id_count.to_i
+ end
+
+ def test_relation_merging_with_eager_load
+ relations = []
+ relations << (Post.order('comments.id DESC') & Post.eager_load(:last_comment) & Post.scoped)
+ relations << (Post.eager_load(:last_comment) & Post.order('comments.id DESC') & Post.scoped)
+
+ relations.each do |posts|
+ post = posts.find { |p| p.id == 1 }
+ assert_equal Post.find(1).last_comment, post.last_comment
+ end
+ end
+
+ def test_relation_merging_with_preload
+ [Post.scoped & Post.preload(:author), Post.preload(:author) & Post.scoped].each do |posts|
+ assert_queries(2) { assert posts.first.author }
+ end
end
end

0 comments on commit 51a1d5a

Please sign in to comment.