This project is archived and is in readonly mode.

#546 ✓stale
acechase

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

Reported by acechase | July 3rd, 2008 @ 04:39 PM | in 2.x

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.

Comments and changes to this ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

People watching this ticket

Referenced by

Pages