Возврат ассоциации ActiveRecord с похожими записями, сгруппированными вместе - PullRequest
0 голосов
/ 20 мая 2019

У меня есть стол (OutGoingQuoteLineItems).Я хочу вернуть полный список записей из этой таблицы с некоторыми «дублирующимися» записями, сгруппированными по ряду атрибутов, если все упомянутые атрибуты совпадают.Я знаю, что могу получить подмножество записей, сгруппированных по атрибутам, но мне действительно нужен полный набор, который включает в себя все записи.

Есть несколько ключевых деталей, которые усложняют эту задачу.

  1. Для записей, которые имеют один или несколько «дубликатов», я хочу показать одну запись в возвращенной коллекции, где 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

Одно решение, которое, я думаю, могло бы работать, но было бы уродливо и не давало бы мне того, чего я хотел бы - получить полный набор, исключая дубликаты, превратить его в хеш, а затем объединить в дубликаты.К сожалению, это решение будет довольно уродливым и не очень эффективным для больших наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...