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.