2013-03-15 70 views
1

我正在Rails控制檯中工作。我想在兩個不同的表中選擇同一個命名列的SUM。從Rails中的多個表中選擇求和結果

這裏是我的ActiveRecord的代碼:

Computer.joins(:services, :repairs) 
.select("computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST") 
.group("computers.id") 

這種運作良好,並返回以下正確的SQL:

`SELECT computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST 
FROM "computers" INNER JOIN "services" ON "services"."computer_id" = "computers"."id" 
INNER JOIN "repairs" ON "repairs"."computer_id" = "computers"."id" 
GROUP BY computers.id ` 

但它給出了Rails的控制檯以下結果:

=> [#<Computer id: 36>, #<Computer id: 32>] 

我不應該能夠訪問我的SUM值嗎?我在postgres中運行了上面的SQL查詢,並給出了所需的輸出。

任何幫助,將不勝感激。

謝謝。

+0

你應該仍然可以訪問總和。我認爲AR只顯示返回列名及其值的列表。如果您將該查詢分配給'computers',請嘗試'computers.first.SCOST' – jvnill 2013-03-15 07:32:22

+0

我得到NoM​​ethodError:未定義的方法'SCOST' – Marklar 2013-03-15 07:37:44

+0

我打算建議下載別名,但有人已經回答了這個問題。你可以試試嗎? – jvnill 2013-03-15 07:44:54

回答

2

Rails的控制檯使用inspect方法來顯示該對象的內容。此方法不顯示自定義字段的值。您將能夠通過顯式引用它在控制檯上打印自定義屬性的值。

Computer.joins(:services, :repairs) 
.select("computers.id, SUM(services.cost) as scost, SUM(repairs.cost) as rcost") 
.group("computers.id").each do |c| 
    puts c.scost 
    puts c.rcost 
end 

編輯

例如基於評論:

創建控制器的一個成員變量:在您的看法

@computers = Computer.joins(:services, :repairs) 
.select("computers.id, SUM(services.cost) as scost, SUM(repairs.cost) as rcost") 
.group("computers.id") 

迭代變量

- @computers.each do |computer| 
    = computer.scost 
    = computer.rcost 

EDIT2

您需要使用LEFT OUTER JOIN以獲取計算機值缺少維修或服務。

join_sql = "LEFT OUTER JOIN services ON services.computer_id = computers.id 
      LEFT OUTER JOIN repairs ON repairs.computer_id = computers.id" 
sum_sql = "SUM(COALESCE(services.cost, 0)) as scost, 
      SUM(COALESCE(repairs.cost, 0)) as rcost" 

@computers = Computer.joins(join_sql) 
.select("computers.id, #{sum_sql}") 
.group("computers.id") 
+0

偉大的工作Harish。這將結果打印出來,我會想到: '47711.97 4121.95 25131.54 10606.5 => [#<計算機ID:36>,#<計算機ID:32>]' – Marklar 2013-03-15 07:55:52

+0

我將如何去訪問這些和值從我的視圖中的實例變量? – Marklar 2013-03-15 07:56:22

+0

我已經更新了答案看看。 – 2013-03-15 16:12:23

0

嘗試如下,

@computer_list = Computer.joins(:services, :repairs).select("computers.id, SUM(services.cost) as SCOST, SUM(repairs.cost) as RCOST").group("computers.id") 
@computer_list.last.SCOST 
+0

感謝您的幫助。我得到的結果是:NoMethodError:未定義的方法'SCOST'爲#<計算機ID:32> – Marklar 2013-03-15 07:41:09