Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

Error in AR::AssociationPreload::ClassMethods#preload_associations when records are from multiple classes

#546

This is a similar problem to the one I created a ticket for earlier, here:

http://dev.rubyonrails.org/ticke...

which was subsequently fixed:

http://dev.rubyonrails.org/chang...

However, on further testing I believe that the fix should have been at one level higher up, in #preload_associations, rather than #preload_one_association. I have a forked version of rails where I've made the fix (on the 2.1 branch), which can be seen here (apologies for the debug clutter):

http://github.com/glyde/rails/co...

The error occurs when trying to do an include like this:

find(:all, :includes => {:a => {:b => :c}}

where both :b and :c are polymorphic associations. In this scenario the :b associations are fetched appropriately, but then :c is loaded incorrectly because the #preload_associations method is doing:

parents.first.class.preload_associations(parents, child)

where 'parents' is not guaranteed to contain records of only one type. So what ends up happening is the preload code has the incorrect class_name specified in the conditions for the queries on :c.

I believe that if the parents.group_by change is added to #preload_associations than the similar records.group_by in #preload_one_association can be removed, because all records will be of one type by the time they get to that method.

Unfortunately, I don't have time at the moment to create a proper test case, but hopefully the bug is self-evident when looking at the #preload_associations method in light nested polymorphic includes.

Reported by acechase · July 3rd, 2008 @ 04:39 PM

State: stale
Milestone: 2.x
Assigned to: nobody
Importance: none