Permalink
Browse files

When preloading group by reflection rather than by class [#125 state:…

…resolved]

This avoids extra queries when several subclasses inherit the association
from their parent class, while still coping with subclasses redefining
associations.

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
  • Loading branch information...
1 parent 0cbdd96 commit 236f0bb67adecbc1e6dac5258e4a8cb310ffd7a4 @fcheung fcheung committed with lifo May 6, 2008
@@ -31,12 +31,12 @@ def preload_associations(records, associations, preload_options={})
private
def preload_one_association(records, association, preload_options={})
- reflection = reflections[association]
- raise ConfigurationError, "Association named '#{ association }' was not found; perhaps you misspelled it?" unless reflection
-
- # Not all records have the same class, so group then preload.
- records.group_by(&:class).each do |klass, records|
- reflection = klass.reflections[association]
+ class_to_reflection = {}
+ # Not all records have the same class, so group then preload
+ # group on the reflection itself so that if various subclass share the same association then we do not split them
+ # unncessarily
+ records.group_by {|record| class_to_reflection[record.class] ||= record.class.reflections[association]}.each do |reflection, records|
+ raise ConfigurationError, "Association named '#{ association }' was not found; perhaps you misspelled it?" unless reflection
send("preload_#{reflection.macro}_association", records, reflection, preload_options)
end
end
@@ -603,4 +603,10 @@ def test_count_with_include
assert_equal 3, authors(:david).posts_with_comments.count(:conditions => "length(comments.body) > 15")
end
end
+
+ def test_load_with_sti_sharing_association
+ assert_queries(2) do #should not do 1 query per subclass
+ Comment.find :all, :include => :post
+ end
+ end
end

0 comments on commit 236f0bb

Please sign in to comment.