Взять количество заказа и цену объектов, которым он принадлежит, чтобы показать общее количество в Rails 6

#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