2013-04-01 33 views
1

在我的数据库,我有以下表和关系:--has_many--<结果Rails的 “嵌套” 联接查询

的样本被认为是“分析

检查--has_many--<样品'如果它有一个或多个与之相关的结果。如果对其所有样品进行分析,则视为“完整”。我需要找到所有'不完整'的检查;也就是说,所有检查至少有一个未经过分析的样本。

我查询mysql数据库做,这是

SELECT DISTINCT inspections.* 
    FROM inspections 
    JOIN samples s ON inspections.id = s.inspection_id 
    LEFT OUTER JOIN results r ON r.`sample_id` = s.`id` 
    WHERE r.id IS NULL 

我想在一个不错的ActiveRecord find调用(除了find_by_sql)转这一点,但我不知道怎么弄将“嵌套”关联(术语?)加入语法中。

任何人都可以帮我吗?顺便说一句,这是一个Rails 2.3应用程序。


现在我有

Inspection.all(:select => "distinct inspections.*", 
    :joins => "join samples on samples.inspection_id = inspections.id " + 
    "left join results on results.sample_id = samples.id", 
    :conditions => "results.id is null") 

它的工作原理,但看起来还是未精制的和太近整个SQL语句。有没有比这更清洁的东西?

回答

1

使用:include在查找声明:

Inspection.find(:all, :include => {:samples => :results}) 

编辑:

我错过了之前INNER JOINLEFT JOIN组合。我很抱歉。

虽然它不会生成相同的查询,但您可以添加其他位置检查以筛选出没有任何样本的检查。

Inspection.find(:all, 
    :select => "DISTINCT inspections.*", 
    :include => {:samples => :results}, 
    :conditions => "results.id IS NULL AND samples.id IS NOT NULL") 

但是请注意,这是方法不会与JOIN在做它执行为好。

+0

不完全。如果我包含':conditions =>“results.id为null”'来匹配SQL查询,它几乎可以工作,但它包括没有样本的检查。我需要排除这些。 – istrasci