Таким образом, код создает SQL-запрос с использованием синтаксиса метода привязки ActiveRecord. В качестве конечной части большинства таких цепей можно использовать .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
Это, как представляется, возвращает необходимую информацию, и, я думаю, что вы ищете (или близко к нему).
Спасибо, ответ, чтобы назвать суммы в select: ... select ("sum (a) как a, sum (b) как b, sum (c) as c") – user2693866