在Rails 3中,跟踪给定RESTful资源的访问次数的最有效方法是什么?

时间:2013-02-03 23:35:38

标签: ruby-on-rails database postgresql optimization model

我搜索了这个,很惊讶没有找到答案,所以我可能会过于复杂。但是,基本上我在我的Rails 3应用程序中有几个RESTful模型,我想以一种非常简单的方式跟踪,只是为了随着时间的推移进行流行度跟踪。在我的情况下,我只对跟踪GET / show方法 - 用户登录的点击并查看这两个资源感兴趣,他们的访问次数随着每次查看/页面加载而上升。

所以,我在Books模型上放了一个“访问”专栏:

==  AddVisitsToBooks: migrating ===============================================
-- add_column(:books, :visits, :integer)
-> 0.0008s
==  AddVisitsToBooks: migrated (0.0009s) ======================================

该列初始化为零,然后,基本上,在books_controller内,

def show
  unless @book.owner == current_user      #hypothetically, we won't let an owner 
                                          "cheat" their way to being popular
  @book.visits = @book.visits + 1
  @book.save
end

这样可以正常工作,除非现在每次调用show方法时,你不仅要对对象记录执行读操作,还要进行写操作。也许这触及了我的问题的核心;在中小型生产应用程序中插入单个整数更改所需的总开销是多少?或者它是一个小交易,或基本上什么都没有?

有更聪明的方法吗?我想出的其他所有内容仍然涉及每次查看给定页面时写入记录。即使我很少用它搜索,对该字段编制索引会有帮助吗?

顺便说一句,数据库是PostgreSQL 9(在Heroku上运行)。

谢谢!

2 个答案:

答案 0 :(得分:4)

你上面描述的有一个重要的缺点:一旦进程更新数据库(增加访问计数器),行被阻止,如果有任何其他进程,它必须等待..我建议使用数据库序列,因为:{ {3}}但是,您需要在代码中维护自定义序列:http://www.postgresql.org/docs/8.1/static/sql-createsequence.html

答案 1 :(得分:2)

经过一些搜索后,我决定从模型中取出访问计数器,因为正如MiGro所说,每次显示页面时都会阻止该行,即使只是片刻。我认为数据库序列方法可能是最快的,我将更多地研究它,但目前它有点超出我的想象,并且在ActiveRecord中实现起来似乎有点麻烦。因此,

https://github.com/charlotte-ruby/impressionist

似乎是一个不错的选择;保持视图计数在一个替代表中并利用一个超过1200个机器人等黑名单的宝石等。