Rails连接表和多个总和

时间:2013-08-18 12:45:39

标签: ruby-on-rails

我想要做的是连接表和总和3列。

   self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").select("sum(a), sum(b), sum(c)")

给我

#<ActiveRecord::Relation [#<DocumentProduct id: nil>]>

类似的东西:

   self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").sum("a")

但我想要3笔钱。我不能做总和(“a,b,c”)。问题在哪里?

1 个答案:

答案 0 :(得分:1)

因此,代码正在使用ActiveRecord链式方法语法构建SQL查询。可以使用.to_sql作为大多数此类链的最后一部分(基本上,只要它仍然是一个ActiveRecord对象,而不是转换为一个数组,例如)来查看生成的SQL,或者确实检查日志,如果它打开了。考虑到链条的共同部分:

self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id")

这会生成类似的东西(可能不太准确,因为我猜测你的应用程序有点):

SELECT "document_products".* FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

您列出的两个最终方法非常不同; select选择要返回的查询中的哪些列,而sum是一个聚合函数,它希望在每种情况下都返回单个值。考虑到select,我们会得到以下内容:

SELECT SUM(products.a), SUM(products.b), SUM(products.c) FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

解释此查询时,无法找到预期的数据,从而导致出现问题。但是,确保GROUP BY部分中包含SELECT子句会产生必要的信息。尝试这样的事情:

self.document_products.joins("JOIN products ON products.id = document_products.product_id").group("products.tax_id").select("products.tax_id, sum(a), sum(b), sum(c)")

这会生成类似以下内容的SQL:

SELECT products.tax_id, SUM(products.a), SUM(products.b), SUM(products.c) FROM "document_products" JOIN products ON products.id = document_products.product_id WHERE "document_products"."document_id" = 1497 GROUP BY products.tax_id

这似乎返回了必要的信息,而且,我认为,您正在寻找(或接近它)。