2

我搜索了这个,很惊讶没有找到答案,所以我可能过于复杂了。但是,基本上我的 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 上运行)。

谢谢!

4

2 回答 2

4

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

于 2013-02-03T23:45:59.213 回答
2

经过一番搜索,我决定从模型本身中删除访问计数器,因为正如 MiGro 所说,每次显示页面时都会阻塞该行,即使只是片刻。我认为 DB 序列方法可能是最快的,我将对其进行更多研究,但目前它有点超出我的范围,在 ActiveRecord 中实现似乎有点麻烦。因此,

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

似乎是一个不错的选择;将视图计数保存在备用表中,并使用包含 1200 多个机器人等黑名单的 gem。

于 2013-02-04T18:07:51.587 回答