我想要做的是连接表和总和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”)。问题在哪里?
答案 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
这似乎返回了必要的信息,而且,我认为,您正在寻找(或接近它)。