1

在我的数据库中,我有以下表格和关系:

检查 --has_many--< 样品 --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

我正在尝试将其转换为一个不错的 ActiveRecordfind调用(除了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 语句。还有比这更干净的东西吗?

4

1 回答 1

1

:include在 find 语句中使用:

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

编辑:

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

虽然它不会生成相同的查询,但您可以添加额外的 where 检查以过滤掉没有任何样本的检查。

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

但是请注意,这种方法的性能不如使用JOINs.

于 2013-04-01T22:22:42.623 回答