我搜索了这个,但很惊讶没有找到答案,所以我可能把它复杂化了。但是,基本上我的 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 上运行)。
谢谢!
最佳答案
你上面描述的有一个明显的缺点:一旦进程更新数据库(增加访问计数器),该行就会被阻塞,如果有任何其他进程,它必须等待。出于这个原因,我建议使用数据库序列:http://www.postgresql.org/docs/8.1/static/sql-createsequence.html但是,您需要在代码中维护序列自定义:Ruby on Rails+PostgreSQL: usage of custom sequences
关于ruby-on-rails - 在 Rails 3 中,跟踪给定 RESTful 资源的访问次数的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678640/