Rails处理大表中的数据

时间:2019-03-15 06:02:15

标签: ruby-on-rails activerecord scalability

我有一个带有这样的架构的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

问题是,这是一张大桌子,我担心它会炸毁我的记忆。我在Google上搜索了一些,并建议使用find_in_batches撰写一些文章。我认为这不符合我的需要,因为用户关注的某些主题可能不在当前批次中。想知道这里推荐的做法来解决此类问题吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找的实际上是聚合。

group_by user_id
inset all topic_id inside an array

您的最终答复如下所示:

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

然后使用单个循环将此哈希数组转换为单个哈希。

要在Postgre中引用聚合,请使用以下命令: Aggregation in Postgre