Rails rails 中 最近来访 功能的实现

tassandar · 2012年03月01日 · 最后由 quakewang 回复于 2012年03月02日 · 3630 次阅读

在项目中需要实现一个 “最近来访的功能” 只需要记录最近访问的十个人。感觉记录在数据库中太亏了,想记录在每个用户的 cookie 中。不知道有没有人做过,有比较好的代码能够分享分享?

用 devise 的话,本来就会记录 last_sign_in_at,直接用来排序,就 ok

系统有 redis 的话,可以弄个 list,插入新的,剔除老的

#1 楼 @ywencn 想要的是和人人差不多的那种最近访问。不是最近登录。

#2 楼 @Rei 嗯。如果有一个数据库能够记录数组这种东西就好了。但是我们用的是 mysql。

#3 楼 @tassandar 不冲突,顺便可以把 cache 放到 redis 上,cache 现在不用以后也要用的

#3 楼 @tassandar 不冲突,顺便可以把 cache 放到 redis 上,cache 现在不用以后也要用的

#3 楼 @tassandar 不冲突,顺便可以把 cache 放到 redis 上,cache 现在不用以后也要用的

#4 楼 @Rei 嗯。好好。看来还要研究研究。

#7 楼 @tassandar 先不考虑缓存的方法 最原始的方法: user has many visitors

用户 A 来访用户 B -> 查询 B 的 visitors 数量,如果小于 10,插入一条记录到 visitors 表里面,或更新时间 如果等于 10,先删掉最后一条,再插入。

再简单一点,不用表,只用一个数组字段序列化到 user 表里面

#8 楼 @hooopo 嗯。这其实是大家都能想到的第一反应吧。其实本质只需要每一个用户能够维护一个队列就可以。 但是就是觉得这样很有点小题大做的感觉,我只要一个 10 条数据的数组就可以搞定了居然要插入删除数据库,所以希望能找一个轻巧一点的方法。

#8 楼 @hooopo 再简单一点,不用表,只用一个数组字段序列化到 user 表里面 这个我也想过。写一个 string,把时间和 id 写进去,然后传给 js 用 ajax 分割解析后直接向数据库请求。

#10 楼 @tassandar 其实,我觉得吧 上面的几种方案都是可行的。而且用数据库的方案更灵活,比如要统计最近被访问最多的人这种需求的时候也很方便做。

做这种设计的时候也要综合考虑其他因素。

如果项目里没有用到 redis mongodb 什么的还是直接用 mysql。

好像有个原则叫 “如无必要,勿增实体”,在这里郑重的 at 一下蜗牛同学.. @ywencn :-)

#11 楼 @hooopo 哇靠,躺着也中枪啊

在数据库,一个类似数组的字段就能搞定了,不用劳烦 Redis

可以把必要的信息(比如 user_id, visited_at 等)保存成 JSON 格式,放在某个字段里。然后重写一下这个字段的 writer 和 reader 方法。使用 JSON 的话,可以让其他语言也能读取。

rails 3.2 里 ActiveRecord::Store 的 store,就是把一些属性序列化后保存的。

#15 楼 @zhangyuan 嗯。我也是准备这么做。把数组 YAML.dump 存起来,然后 YAML.load 就可以。

这种需求用关系型数据库是最方便的:

class Visit
  belongs_to :user
  belongs_to :visitor, :class_name => "User"
end

然后写一行 filter 就搞定了

Visit.find_or_initialize_by_user_id_and_visitor_id(user, current_user.id).update_attributes(:visited_at, Time.now)
需要 登录 后方可回复, 如果你还没有账号请 注册新账号