У меня есть стол (OutGoingQuoteLineItems
).Я хочу вернуть полный список записей из этой таблицы с некоторыми «дублирующимися» записями, сгруппированными по ряду атрибутов, если все упомянутые атрибуты совпадают.Я знаю, что могу получить подмножество записей, сгруппированных по атрибутам, но мне действительно нужен полный набор, который включает в себя все записи.
Есть несколько ключевых деталей, которые усложняют эту задачу.
- Для записей, которые имеют один или несколько «дубликатов», я хочу показать одну запись в возвращенной коллекции, где
quantity
- сумма атрибута quantity
для каждой записи, где атрибуты соответствуют одному или несколькимдругие записи в наборе.
Так, например, с учетом следующего набора данных:
<OutgoingQuoteLineItem part_id: 1, condition: "new", quantity: 1>
<OutgoingQuoteLineItem part_id: 1, condition: "new", quantity: 1>
<OutgoingQuoteLineItem part_id: 1, condition: "used", quantity: 1>
<OutgoingQuoteLineItem part_id: 1, condition: "used", quantity: 2>
<OutgoingQuoteLineItem part_id: 1, condition: "refurbished", quantity: 1>
<OutgoingQuoteLineItem part_id: 1, condition: "refurbished", quantity: 1>
Запрос должен вернуть следующее:
<OutgoingQuoteLineItem part_id: 1, condition: "new", quantity: 2>
<OutgoingQuoteLineItem part_id: 1, condition: "used", quantity: 3>
<OutgoingQuoteLineItem part_id: 1, condition: "refurbished", quantity: 2>
Возвращенная коллекция должна быть ассоциацией, которая может быть разбита на страницы, хотя это не является строгим требованием.
Пока у меня есть следующий код, который возвращает подмножество записей, которые имеют дубликаты.Я не уверен, как втиснуть это в то, что мне нужно.
part = Part.find(1)
part.outgoing_quote_line_items.joins(
:outgoing_quote
).select(
:outgoing_quote_id,
:created_by_id,
:quote_type,
:condition,
:quantity,
:price_per_unit,
"to_char(outgoing_quote_line_items.created_at,'YYYY-MM-DD')",
'outgoing_quotes.company_id'
).group(
:id,
:outgoing_quote_id,
:created_by_id,
:quote_type,
:condition,
:quantity,
:price_per_unit,
"to_char(outgoing_quote_line_items.created_at,'YYYY-MM-DD')",
'outgoing_quotes.company_id'
).having(
'count(*) > 1'
)
Обратите внимание, что для того, чтобы запись считалась дубликатом, должна быть одна или несколько других записей, где все следующие атрибутыравно:
Outgoing Quote ID
Created By ID
Quote Type
Condition
Price Per Unit
Created At formatted as YYYY-MM-DD
Company ID from the Outgoing Quote
Одно решение, которое, я думаю, могло бы работать, но было бы уродливо и не давало бы мне того, чего я хотел бы - получить полный набор, исключая дубликаты, превратить его в хеш, а затем объединить в дубликаты.К сожалению, это решение будет довольно уродливым и не очень эффективным для больших наборов данных.