因此,代码使用 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
这似乎返回了必要的信息,我认为,这就是你正在寻找的(或接近它)。