Я в недоумении, пытаясь успешно вызвать связанный столбец при создании агрегатной функции в Postgres с использованием Rails 5.2. Я продолжаю получать следующую ошибку:
PG::GroupingError: ERROR: column "items.name" must appear in the GROUP BY clause or be used in an aggregate function
Я пробовал пару решений, таких как добавление столбца items.name
в мое предложение группы, но он возвращает нежелательный результат из-за связи own_to / has_many между sale_selections: :item
.
Я также пытался использовать DISTINCT ON (sale_selections.id) sale_selections.id, items.name, etc
. Но это дает мне тот же результат ошибки.
Можно ли включить столбец в метод выбора без необходимости добавлять его в предложение group и при этом иметь возможность ссылаться на него? Или мне нужно найти другое решение?
Мой запрос
@search = Sale.joins(sale_selections: :item)
.select('sale_selections.id, items.name, AVG(sale.price) as price)
.group('sale_selections.id').where('sale.price IS NOT NULL')
Мой взгляд
<% @search.each do |s| %>
<%= s.name %> <br />
<%= s.sale %>
<% end %>
Модельные ассоциации
class Sale < ApplicationRecord
has_many :sale_selections, dependent: :destroy
end
class Item < ApplicationRecord
has_many :sale_selections
end
class SaleSelection < ApplicationRecord
belongs_to :Sale
belongs_to :Item
end
Обновление
Выполнение следующего запроса не дает правильных результатов из-за связи между sale_selections: :item
.
@search = Sale.joins(sale_selections: :item)
.select('items.id, items.name, AVG(sale.price) as price)
.group('items.id').where('sale.price IS NOT NULL')
Предоставляет одинаковую среднюю цену для всех элементов в запросе вместо правильных значений, которые дает группировка по sale_selections.id
.
Продается стол
| id | price |
| 1 | 2.50 |
| 2 | 1.50 |
| 3 | 1.30 |
Таблица наименований
| id | name |
| 1 | Apple |
| 2 | Banana |
Таблица выбора продаж
| id | sale_id | item_id |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 2 | 3 | 2 |
Таким образом, мой средний результат для яблока должен быть 2,50, а для банана - 1,40. Но если я добавлю item.name
к групповому методу, я получу 1.77 как в Apple, так и в Banana.