#sql #ruby-on-rails #ruby #postgresql #activerecord
#sql #ruby-on-rails #ruby #postgresql #activerecord
Вопрос:
У меня есть объект Tool
с a price
и a ToolsOrder
для каждой продажи с a quantity
. Мне нужно показать общее количество продаж
Tool has many: tools_orders
ToolsOrders belongs_to: tool
Я думаю, что-то подобное или подобное? Я не могу заставить это работать
ToolsOrder.sum("quantity * Tool.price")
Как я могу рассчитать общую сумму?
Ответ №1:
Иногда полезно прочитать сообщения об ошибках, которые выдает вам код. Предполагая, что ошибка, которую вы получили, была: missing FROM-clause entry for table "tool"
. Это говорит о том, что вы запрашиваете price
таблицу from tool
, но в текущем запросе такой таблицы нет.
Вам не хватает соединения.
ToolsOrder.joins(:tool).sum("quantity * tools.price")
Это можно сделать безопаснее с помощью Arel, хотя, если хотите.
ToolsOrder.joins(:tool).sum(ToolsOrder.arel_table[:quantity] * Tool.arel_table[:price])
Теперь нет чистого sql, в котором легко делать опечатки (инструмент против инструментов) и открыт для sql-инъекций.
Комментарии:
1. Спасибо, небольшая проблема с количеством в обеих таблицах, одна из которых — запас, а другая — продажа, и теперь у меня есть ошибка PG :: AmbiguousColumn: ОШИБКА: ссылка на столбец «количество» неоднозначна СТРОКА 1:
2. Вам также нужно добавить префикс имени таблицы к количеству (
tools_orders.quantity
), чтобы указать, какое количество вы имеете в виду. Или используйте решение Arel