我搜索了这个,很惊讶没有找到答案,所以我可能会过于复杂。但是,基本上我在我的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上运行)。
谢谢!
答案 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个机器人等黑名单的宝石等。