1

私のデータベースには、次のテーブルと関係があります。

検査 --has_many--< サンプル --has_many--< 結果

1 つ以上の結果が関連付けられている場合、サンプルは「分析済み」と見なされます。すべてのサンプルが分析された場合、検査は「完了」と見なされます。「不完全な」インスペクションをすべて見つける必要があります。つまり、分析されていないサンプルが少なくとも 1 つあるすべての検査です。

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 ステートメント全体に近すぎます。これより少しきれいなものはありますか?

4

1 に答える 1

1

:includefind ステートメントで使用します。

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

編集:

INNER JOINLEFT JOINbeforeの組み合わせが抜けていました。謝罪いたします。

同じクエリは生成されませんが、追加の where チェックを追加して、サンプルを持たない検査を除外することができます。

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

ただし、このアプローチは s を使用した場合ほどうまく機能しないことに注意してくださいJOIN

于 2013-04-01T22:22:42.623 に答える