<h3>Background</h3>

<p>Normal rails eager-loading of collections works like this:</p>

<pre><code>Person.find(:all, :include=&gt;:companies)
</code></pre>

<p>This generates some sql which does</p>

<pre><code>LEFT OUTER JOIN companies ON people.company_id = companies.id
</code></pre>

<h3>Question</h3>

<p>However, I need a custom join (this could also arise if I was using <code>find_by_sql</code>) so I can't use the vanilla <code>:include =&gt; :companies</code></p>

<p>The custom join/sql will get me all the data I need, but how can I tell activerecord that it belongs to the associated <code>Company</code> objects rather than just being a pile of extra rows?</p>

<h3>Update</h3>

<p>I need to put additional conditions in the join. Something like this:</p>

<pre><code>SELECT blah blah blah
LEFT OUTER JOIN companies ON people.company_id = companies.id AND people.magical_flag IS NULL 
&lt;Several other joins&gt;
WHERE blahblahblah
</code></pre>

Can you not add the join conditions using ActiveRecord?
For example, I have a quite complex query using several dependent records and it works fine by combining conditions and include directives
```
```
Contractors.find(
  :all, 
  :include => {:council_areas => :suburbs},
  :conditions => ["suburbs.postcode = ?", customer.postcode]                 
)
```
```
Assuming that:
Contractors have_many CouncilAreas
CouncilAreas have_many Suburbs
This join returns the Contractors in the suburb identified by
customer.postcode
.
The generated query looks like:
```
```
SELECT contractors.*, council_areas.*, suburbs.*
FROM `contractors` 
LEFT OUTER JOIN `contractors_council_areas` ON `contractors_council_areas`.contractor_id = `contractors`.id 
LEFT OUTER JOIN `council_areas` ON `council_areas`.id = `contractors_council_areas`.council_area_id 
LEFT OUTER JOIN `council_areas_suburbs` ON `council_areas_suburbs`.council_area_id = `council_areas`.id 
LEFT OUTER JOIN `suburbs` ON `suburbs`.id = `council_areas_suburbs`.suburb_id WHERE (suburbs.postcode = '5000')
```
```
(Note: I edited the column list for brevity).