2013-08-18 5 views
0

Что я хочу сделать, так это объединить таблицу и суммировать 3 столбца.Rails join table и multi sum

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

Таким образом, код создает 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 

Это, как представляется, возвращает необходимую информацию, и, я думаю, что вы ищете (или близко к нему).

+0

Спасибо, ответ, чтобы назвать суммы в select: ... select ("sum (a) как a, sum (b) как b, sum (c) as c") – user2693866