Thanks to a great suggestion by Josh Susser. I've spent the past two
days completely re-working the code I submitted in the eariler patch.
The new patch; http://dev.rubyonrails.org/ticket/10012
accomplishes the same results, but with a much better api.
The earlier patch added a new option for use with :include which named
associated AR classes not to be eagerly loaded. This negative
specification was awkward.
At Josh's suggestion, the new patch extends the values acceptable to
the existing :joins option.
If a string it used things will work as before. If not, the values
take the same form as values for :include, i.e. symbols, hashes, and
arrays of symbols and hashes. These are used to construct a join
clause for the sql query, and the same code used to process the
results for the :include option, patched to be aware of these new
active record joins, instantiates the result objects, stripping out
the extra attributes from the join, so that the results are writable
(unlike those returned from :joins with a string value.
This allows you to add tables to a query for use in the conditions,
but not instantiate unneeded associated objects when they will not
(all) be needed. In addition since this generates a regular inner
join rather than the left outer join generated by :include, less data
may be returned to be processed in cases where there are records with
missing associated records.
I look forward to feedback.