如何对活动供稿中的类似商品进行分组

对于社交网站,我有来自您关注的人的活动活动,我想在短时间内将类似类型的活动分组在一起,以获得更紧凑的活动供稿。 想象一下,当你快速接受几件事时,Facebook如何显示逗号分隔列表:’乔喜欢啤酒,足球和筹码。’

我理解在ActiveRecord Enumerable结果上使用group_by方法,但是需要完成一些初始工作,填充我之后可以分组的属性。 我的问题涉及以可以标记这些分组的方式存储活动数据,然后再次检索它们。

现在我有一个Activity模型,它是提交活动的用户和它链接到的项目之间的连接关联(在上面的例子中,假设’beer’,’football’和’chips’是a的记录喜欢模特)。 除了“喜欢”之外还有其他活动类型(活动,保存collections夹等)。 我正在考虑的是,在创建此关联时,会在完成该类型的最后一次关联时进行检查,如果超过某个时间段,则会增加一个“活动块”计数器,这是一部分活动模型。 稍后,在渲染此活动Feed时,我可以按用户分组,然后键入,然后键入此活动块。

示例:假设在同一天内进行了2次更新。 用户在2:05喜欢2件事,之后在5:45喜欢3件事。 在第三次更新(第二个块的开始)发生在5:45之后,模型检测到已经过了太多时间并且将其活动块计数器递增1,从而在通过以下方式呈现新块时强制执行任何后续更新。 group_by电话:

2:05 Joe likes beer nuts and Hooters. 5:45 Joe likes couches, chips and salsa. 7:00 Joe is attending the Football Viewing Party At Joe's 

我的第一个问题:增加这样一个计数器的有效方法是什么? 它不再是auto_increment,所以我能想到的最简单的事情就是将最后一条记录作为参考点。 但是,这不能来自在上次更新该类型时检查的同一查询,因为稍后更新另一种类型可能已经收到下一个计数器值。 它们不一定是全球唯一的,但那会很好。

我想到的另一个整体策略是另一个名为ActivityBlock的模型,它将类似活动的组合在一起。 在许多情况下,更新将自行隔离,因此为每个单独的活动创建一条记录似乎效率不高。

这些中的任何一个看起来都是一个可靠的策略

我的最后一个问题围绕着分页。 既然我们正在处理块,那么在分页开始之前总是显示一定数量的条目就更难了。单个(隔离的)Activity更新或者当时的块应该只计为1,所以最低我的group_by的一层,我可以合并一个计数器来跟踪我显示的行数,但这意味着我不能再进行一次数据库查询,只需指定一个限制语句。 在我达到页面限制之前,有没有办法在不重复执行其他SQL查询的情况下仍然可以执行此操作?

这将是ActivityBlock模型方法的一个优点,因为我可以轻松地对其应用限制调用,并且块也可以包含自动增量计数器。

查看http://railscasts.com/episodes/406-public-activity他还在第407集中发布了一篇关于如何从头开始的内容(虽然这是专业插曲)。

您可以使用纪元时间或其变体作为计数器,因为这是半独特和确定性的