如何通过rails中的自定义连接来加载对象?

Ori*_*rds 30 ruby sql activerecord ruby-on-rails

背景

正常的铁路集合急切加载如下:

Person.find(:all, :include=>:companies)
Run Code Online (Sandbox Code Playgroud)

这会生成一些sql

LEFT OUTER JOIN companies ON people.company_id = companies.id
Run Code Online (Sandbox Code Playgroud)

但是,我需要一个自定义连接(如果我使用的话也会出现这种情况find_by_sql),所以我不能使用香草:include => :companies

自定义join/sql将获取我需要的所有数据,但是如何告诉activerecord它属于关联Company对象而不仅仅是一堆额外的行?

更新

我需要在连接中添加其他条件.像这样的东西:

SELECT blah blah blah
LEFT OUTER JOIN companies ON people.company_id = companies.id AND people.magical_flag IS NULL 
<Several other joins>
WHERE blahblahblah
Run Code Online (Sandbox Code Playgroud)

Tob*_*ede 7

你能不能使用ActiveRecord添加连接条件?

例如,我有一个非常复杂的查询使用几个依赖记录,它通过组合条件和包含指令工作正常

Contractors.find(
  :all, 
  :include => {:council_areas => :suburbs},
  :conditions => ["suburbs.postcode = ?", customer.postcode]                 
)    
Run Code Online (Sandbox Code Playgroud)

假如说:

  1. 承包商有很多议员
  2. CouncilAreas拥有很多郊区

此连接返回customer.postcode标识的郊区的承包商.

生成的查询如下所示:

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')
Run Code Online (Sandbox Code Playgroud)

(注意:为简洁起见,我编辑了列列表).