33

背景

正常的 rails 急切加载集合的工作方式如下:

Person.find(:all, :include=>:companies)

这会生成一些 sql

LEFT OUTER JOIN companies ON people.company_id = companies.id

问题

但是,我需要一个自定义连接(如果我使用 也可能出现这种情况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
4

4 回答 4

7

不能使用 ActiveRecord 添加加入条件吗?

例如,我有一个使用多个相关记录的非常复杂的查询,并且通过组合条件和包含指令可以正常工作

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

假如说:

  1. 承包商有_many CouncilAreas
  2. CouncilAreas has_many Suburbs

此连接返回由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')

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

于 2008-09-25T03:01:03.277 回答
3

您可以使用以下内容来获得适当的左外连接语法魔术。

Person.reflect_on_association(:companies).options[:conditions] = 'people.magical_flag IS NULL'
于 2010-03-15T12:31:19.577 回答
2

我不确定这是你想要的(我不是 100% 确定我已经理解你的问题和你想要完成的事情)但是:

同时提供:joins和怎么样:includes

Person.find( :all, :joins => 'LEFT OUTER JOIN companies ON people.company_id = companies.id AND _pass_custom_conditions_here_', :includes => :companies )

或AR3方式:

Person.includes(:companies).joins('LEFT OUTER JOIN companies ON people.company_id = companies.id AND _pass_custom_conditions_here_')

于 2012-12-06T17:21:06.123 回答
1

你能详细说明一下你想用这个查询完成什么吗?

另请查看查找的 :joins 选项。它允许您指定要如何连接表。链接文本

使用 :include 时要小心,Rails 2.1 中的行为会发生一些变化,并且在与引用包含表的 :conditions 选项结合使用时可能会导致一些问题。链接文本链接文本是来自 Pivotal 的两篇文章,其中提到了这个问题。

于 2008-09-25T05:51:05.053 回答