2011-02-10 21 views
0

レールで左外部結合を実行する必要がありますが、結合されたテーブルのモデルオブジェクトが必要です。レールで結合されたテーブルのモデルを使用して左外部結合

私が欲しいのは、毎日の測定基準と一緒に、日のリストです。メトリクスがあるかどうかに関わらず、私はいつも一緒にいなければなりませんが、私はデータベースへの往復を望んでいません。

これは動作しますが、それは私が本当にメトリックオブジェクトをしたいときに私はPeriodDayオブジェクトを持っていると考えているので問題が発生します。

PeriodDay.select("metrics.*").join('LEFT OUTER JOIN metrics ON period_days.date = metrics.date').where('period_id = ?', current_period) 

私はメトリックオブジェクトにfind_by_sql使用できますが、クエリの建物が複雑(かつ条件付きであります)この単純化された例よりもむしろ、この問題のために「レールの道」を理解したいと思います。

+0

このようなLEFT OUTER JOINは、存在しないメトリック・オブジェクトになる可能性があるため、メトリック・オブジェクトにNULL IDを持たせるのは意味がありません。 PeriodDayオブジェクトを結果として取得する必要があります。 –

+0

@Pan Thomakosはい、ヌルIDがある可能性がありますが、IDを参照する必要はありません(更新などはありません)。 PeriodDayオブジェクトがある場合、すべてのメトリックフィールドは文字列として扱われます。これは巨大なPITAです。 –

+0

問題は、プライマリ・テーブルがperiod_daysである左外部結合を実行しているため、period_day情報のみを持つ完全にNULLのメトリック・オブジェクトがたくさんある可能性があります。あなたが 'LEFT OUTER JOINメトリック期間'を実行していた場合、これは別のことになります。 –

答えて

0

私の現在の回避策は、レコードをループしてPeriodDayオブジェクトの属性からMetricオブジェクトを作成することです。効率的ではありませんが、複数のデータベース呼び出しよりも優れています。

期間はPeriodDayは多くのメトリックがあり、そのperiod_idがあなたのPeriodDayモデルの属性である、あなたの回避策は、このようなものと同一である必要があり、多くを持っていると仮定すると
metrics = [] 
recs = PeriodDay.select("metrics.*").join('LEFT OUTER JOIN metrics ON period_days.date = metrics.date').where('period_id = ?', current_period) 
for rec in recs 
    metrics << Metric.new(rec.attributes) 
end 
0

Metric.includes(:period_day).where(:period_day => {:period_id => @current_period}) 

これは取得していません最初の質問で言及したように、それぞれのメトリックオブジェクトで日のリストが表示されますが、特定の期間のすべてのメトリックオブジェクトのリストが表示されます。 (私が何かが欠けていない限り)...

付属のMetricオブジェクトでPeriodDayオブジェクトのリストを表示する場合は、joinsの代わりにincludesを使用できます。

PeriodDay.includes(:metrics).where(:period_id => @current_period) 

これは、(期間の日数を取得するには1、その他は、メトリックを取得するために)2つのクエリを実行しますが、それは多くの、より読みやすいです。

+0

メトリックオブジェクトが存在しない期間に空白のMetricオブジェクトが必要なため、最初の解決策は機能しません。 メトリックオブジェクトが必要で、PeriodDayオブジェクトを返すため、2番目の解決策は機能しません。 –

関連する問題