随时跟踪追随者

时间:2012-10-02 19:29:54

标签: ruby-on-rails ruby-on-rails-3 database-design

我想在我的Rails应用程序中构建功能,以显示随着时间推移的跟随者趋势。

目前,我的以下方法涉及创建和销毁关系对象 - 在创建一个带有关注者ID的对象后,跟随和取消关注删除该关系对象。

由于关系对象在取消关注时被删除,因此无法返回并查看在任何给定时间有多少关注者存在。

要解决这个问题,我能想到的最佳解决方案是:

不是在取消关注时删除关系对象,而是创建一个负值为-1的新对象。以下将创建一个正值为+1的对象。因此,将给定对的总值相加将产生它们当前是否跟随(1或0),而历史趋势也可以通过将给定跟随的总跟随值相加来计算。

我的问题是:这是最优雅的解决方案吗?有更简单的方法吗?我意识到可以使用cron作业输出每日数字,但这似乎会重复数据。还有其他建议吗?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我会添加一个活动字段,然后不删除关系记录,我会将记录设置为非活动状态。然后,您必须更新所有面向用户的查询以反映active = 1.然后,您可以使用active = 0的记录进行报告。您还可以添加deactivated_at字段,该字段存储记录已停用的日期。

示例场景是用户1跟随用户2,跟随用户3,跟随用户4,跟随用户2,重新跟随用户2,不跟随用户4。

follower_id followed_id active created_at deactivated_at
1           2           0      9/10/2012  9/13/2012
1           3           1      9/10/2012  NULL
1           4           0      9/10/2012  9/17/2012
1           2           1      9/16/2012  NULL

答案 1 :(得分:1)

只需使用paranoia

https://github.com/radar/paranoia

class Relationship < ActiveRecord::Base
  acts_as_paranoid

  ...
end

(如果您对两个数字ID列有唯一索引,请删除它,使用普通索引)

然后你可以

def currently_following_count(uid)
  Relationship.where(:followed_id => uid).count
end

def historical_following_count(uid)
  Relationship.unscoped.where(:followed_id => uid).count
end