2013-03-15 106 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

相关问题