2011-02-10 58 views
0

我需要在rails中執行左外連接,但我需要模型對象用於連接表。使用軌中連接表的模型進行左外連接

我想要的是一天的列表,以及每天的指標。無論是否存在指標,我都需要有所有日子,但我不想做一堆往返數據庫的行程。

這工作,但會導致因爲它認爲我有PeriodDay對象時,我真的想公制對象問題:

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

我可以度量對象使用的find_by_sql,但查詢的建築是比較複雜的(和條件)比這個簡單的例子,所以我寧願找出這個問題的「軌道方式」。

+0

根據定義,像這樣的左外連接可能導致不存在的度量對象,因此使用帶空ID的度量對象是沒有意義的。您需要獲取PeriodDay對象作爲結果。 – 2011-02-10 20:20:48

+0

@潘Thomakos是的,可能是空IDS,但我不需要引用ID(沒有更新等)。如果我有PeriodDay對象,那麼所有的Metric字段都被視爲字符串,這是一個巨大的PITA。 – 2011-02-10 20:32:14

回答

0

我目前的解決方法是遍歷記錄並從PeriodDay對象的屬性創建Metric對象。它不覺得高效,但比多次數據庫調用要好。

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

假設期間有許多PeriodDay有很多度量,那period_id是你PeriodDay模型的屬性,你的解決方法應該是相同的,以這樣的:

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

這並沒有得到您會看到原始問題中提及的天數列表以及各自的Metric對象,但它會爲您提供特定時間段內所有Metric對象的列表。 (除非我錯過了某些東西...)

如果您想要PeriodDay對象列表及其包含的Metric對象,則可以使用includes而不是joins

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

這將執行兩個查詢(一個獲得週期而另一個獲取度量),但它更具可讀性。