Rails обрабатывает данные из большой таблицы - PullRequest
0 голосов
/ 15 марта 2019

У меня есть таблица topic_followers со схемой, подобной этой

id, user_id, topic_id, creation_date, modified_date

Я хочу сгенерировать хеш из этой таблицы с ключом user_id и массивом topic_ids, за которым этот пользователь следит в качестве значения.В настоящее время я пытаюсь использовать следующий код для достижения этой цели:

topic_followers = TopicFollower.select("user_id, topic_id")
topic_follower_hash = {}
topic_followers.each do |topic_follower|
  topic_follower_hash[topic_follower.user_id] = topic_follower_hash[topic_follower.user_id] || []
  topic_follower_hash[topic_follower.user_id] << topic_follower.topic_id
end

Дело в том, что это большая таблица, и я боюсь, что она уничтожит мою память.Я немного погуглил, и в некоторых статьях предлагалось использовать find_in_batches.Я не думаю, что это соответствует моим потребностям, так как некоторые темы, за которыми следит пользователь, могут отсутствовать в текущем пакете.Хотите знать, какова рекомендуемая практика для решения такого рода проблем?

1 Ответ

0 голосов
/ 15 марта 2019

То, что вы ищете, на самом деле является агрегацией.

group_by user_id
inset all topic_id inside an array

Ваш окончательный ответ будет выглядеть примерно так:

[{"id": "user_id", "topic_ids": ["topic_id1", ...]}...]

Затем используйте один цикл для преобразования этого массива хэшей в один хэш.

Дляссылка на агрегацию в Postgre использует это: Агрегация в Postgre

...