2012-07-30 51 views
0

在我們的rails應用程序中,有3個表格payment_logssourcingspurchasings。 payment_log屬於採購或採購,但不屬於同一時間。採購和採購都有一個col project_id。我們想要拿起all payment_logs with its project_id = project_id_search(從搜索頁面傳遞的project_id_search)。我們還需要一個ActiveRecord作爲返回的結果集。這裏是單獨的查詢,假設payment_logs持有ActiveRecord的結果集:在rails 3.1.4與sqlite3聯合的正確方法?

  1. 挑其採購的PROJECT_ID = project_id_search

    payment_logs = payment_logs.joins所有payment_logs(:採購)。凡(「sourcings.project_id ?= 「project_id_search)

  2. 挑其採購的PROJECT_ID = project_id_search

    payment_logs = payment_logs所有payment_logs(:購買)。凡(」 purchasings.project_i d =?」,project_id_search)

我們需要工會1和2,以拿起所有其PROJECT_ID = project_id_search的payment_logs。什麼是實現它的正確方法?我們沒有在rails中找到union,find_by_sql返回的數組不是我們想要的。謝謝。

回答

1
payment_logs.where([" 
    payment_logs.sourcing_id IN (
           SELECT id FROM sourcings WHERE sourcings.project_id = ? 
          ) 
    OR payment_logs.purchasing_id IN 
           (
           SELECT id FROM purchasings WHERE purchasings.project_id = ? 
          )", project_id_search, project_id_search]) 

SQL的很多,但它應該工作

選項2(兩個SQL請求...):

payment_logs = [] 
payment_logs << PaymentLog.joins(:sourcing).where("sourcings.project_id" => project_id_search) 
payment_logs << PaymentLog.joins(:purchasing).where("purchasings.project_id" => project_id_search) 
payment_logs.uniq! #In case some records have both a sourcing and a purchasing 

選項3,與squeel寶石:https://github.com/ernie/squeel

PaymentLog.where{(source_id.in Sourcing.where(:project_id => project_id_search)) | (purchasing_id.in Purchasing.where(:project_id => project_id_search))} 

我喜歡這個解決方案:) 此外,每當你有疑問生成的SQL,從控制檯或其他任何地方,您可以在ActiveRecord查詢的末尾添加.to_sql以仔細檢查生成的SQL

+0

Works。謝謝。有沒有辦法用rails風格查詢替換SELECT?像Sourcing.where(「project_id =?」,project_id_search).select(「id」)。替換時出現了一堆錯誤。 – user938363 2012-07-30 20:31:02

+0

我試圖找到更好的方法來做到這一點,但找不到太多...我認爲你必須堅持這種醜陋的SQL語法,或者如果你願意做多個SQL請求,你可以同時做請求分開,然後合併兩個結果集 – 2012-07-30 20:35:57

+0

我試圖合併,但沒有解決。我發佈了和你一樣的想法。試圖以rails方式實現。使用的範圍如下:sourcing_id => [sourcing_ids] OR:purchasing_id => [purchasing_ids]並且沒有成功。嘗試在哪裏(「sourcing_id IN?or purchasing_id IN?」,[sourcing_ids],[purchasing_ids])。兩者都沒有解決。 – user938363 2012-07-30 21:01:59

相關問題