Ruby 新人问个很傻很天真的问题

metal · 发布于 2011年12月29日 · 最后由 fredwu 回复于 2012年02月04日 · 2551 次阅读
475

我想知道浏览次数是怎么实现的,我这个字段怎么写? integer还是string?

我能想到的就是 建立一个这样的字段

click_count:integer      :defualt => 0

然后

def show
   Post.click_count += 1 
end

可行吗??

共收到 6 条回复
96

应该是用integer吧。

不建议把这种经常变化的字段和不经常变的字段放在一张表里,这样会导致mysql的query cache失效,posts表很大的时候,就会影响效率;保存时还可能会有很多callback会被执行,比如before_save、更新updated_at等,可能导致lz不期望的后果。

PS:那个 click_count 是实例方法,用在了类上面。。。

1

integer

ActiveRecord 有 increment_counter 方法在数据库层面操作,避免并发冲突

http://apidock.com/rails/ActiveRecord/CounterCache/increment_counter

96

更新字段时,使用 Model.update_all 就可以避免执行 callback

increment_counter 内部也是用的 update_all

8

#2楼 @Rei increment_counter不会调用任何callback,这在使用缓存的时候无法让缓存自动过期,好烦躁

16

#4楼 @hooopo 我觉得阅读量也没必要适时显示吧?如果非要适时显示,可以往redis里读写,然后一段时间同步到数据库中。或者就直接放在redis里。

188

大流量的网站,记得用 INSERT DELAYED (http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html) 来避免性能瓶颈。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册