Как рекурсивно смержить два объекта по индексу?

То есть ситуация какова - есть два агрегированых запроса на разные таблицы по одинаковому полю (это поле есть и в первой и во второй таблице, например, группируем по user_id товары и заказы, при этом используем SUM, COUNT и тд).

Выход есть такой - агрегируем сначала товары по user_id, потом проходим .each() по записям и вытаскиваем заказы по условию WHERE user_id=user.id и там пушим в массив. Но это ужас будет для большого кол-ва товаров, так как кол-во запросов=колвоТоваров+1, ну то есть запрос в цикле это совсем "по-нубски".

В PHP я делал как - две группировки с одинаковыми индексами (user_id), а потом array_replace_recursive справлялся отлично со своей работой. А как тут? Вот какие данные мне возвращает AR

- !ruby/object:Track
  attributes:
    clicks: 7
    hosts: 3
    campaign_id: 4
    id:  1
- !ruby/object:Track
  attributes:
    clicks: 
    hosts: 1
    campaign_id: 2
    id:  2

и

- !ruby/object:Conversion
attributes:
  count_conversions: 2
  id:  1

И хочется получить вот такое

- !ruby/object:Track
  attributes:
    clicks: 7
    count_conversions: 2 // вот эти данные "вмержились" по индексу id=1
    hosts: 3
    campaign_id: 4
    id:  1
- !ruby/object:Track
  attributes:
    clicks: 
    hosts: 1
    campaign_id: 2
    id:  2


Еще, как я понимаю, есть "ручной" способ прохода по первому массиву, потом в каждой итерации первого массива проход по второму массиву и со сравнениями. Но это мне тоже кажется чем-то страшным. Интерпретатор будет материться.

Подскажите пожалуйста, как бы вы сделали подобный мерж с точки зрения как самого языка руби с его фреймом, так и с точки зрения оптимизации скорости выполнения скрипта. Если кому-то не понятно стало мое объяснение, прошу прощения, спрашивайте, я разъясню. Надеюсь на помощь. Спасибо.
  • Вопрос задан
  • 441 просмотр
Пригласить эксперта
Ответы на вопрос 1
@thepry
Ruby on rails, 1С разработчик
Я не до конца понял вопрос, но вместо этого:
Выход есть такой - агрегируем сначала товары по user_id, потом проходим .each() по записям и вытаскиваем заказы по условию WHERE user_id=user.id и там пушим в массив.

Можно получить массив из user_id и сделать один запрос.
Можно сделать так:
products_hash = Products.bla-bla-bla.group_by(&:user_id)
orders_hash = Orders.bla-bla-bla.group_by(&:user_id)
products_hash.merge(orders_hash){ |key, oldval, newval| Тут ваш код, который правильно сопоставит данные из двух массивов }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы