`
huacnlee
  • 浏览: 9574 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Rails 插件 acts_as_views_count - Model访问量延迟统计

阅读更多

项目有很多时候需要进行统计单篇文章的访问次数,如文章、帖子、图片...
于是在表里面设计一个 views_count 字段作为计数器,然后查看页面的时候更新这个字段。

但为了提要效率,一般情况下我们都需要对 views_count 的写入数据库做一下延迟,存到缓存里面去,到了一定数量在更新数据库。

为了方便使用,我把之前的方式改写成了一个插件,第一次做 Rails 插件,比较简单

 

使用例子

Models

View: Source or Raw
1
2
3
4
5
6
7
8
class Post < ActiveRecord::Base
  acts_as_views_count
end

class Topic < ActiveRecord::Base
  # set delay save to db with 30
  acts_as_views_count :delay => 30
end

Controllers

View: Source or Raw
1
2
3
4
5
6
7
class PostsController < ApplicationController
  def show
    @post = Post.find(params[:id])
    # update views_count
    @post.update_views_count
  end
end

Views

View: Source or Raw
1
2
3
4
5
6
7
<div id="post_show">
  <h1><%= @post.title %></h1>
  <div class="info">
    <span><%= @post.views_count_s %> views</span>
    <span><%= @post.comments_count %> comments</span>
  </div>
</div>
分享到:
评论
7 楼 huacnlee 2010-01-18  
edisonlz 写道
huacnlee 写道
edisonlz 写道
问题: 如果达不到delay的数量,那view_count 不会被赋值,一直为0,例如一篇很普通的文章,view_count很小,所以该篇文章的view_count一直为0。
建议:将delay的数量改为时间,

例如: :delay=>5,就是代表5分钟同步到数据库。如果为0则不同步。

但是,在实际应用中,因为要更新view_count的业务逻辑会复杂一下,建议使用消息队列完成此类工作。


可能你没有理解到,用于显示的不是 views_count 而是 views_count_s (acts_as_views_count 里面封装的,它的值是 Cache 里面dalay的数字 + 数据库里面存放的数字)
用这个并不会影响最终的显示结果,只是仅仅把写入数据库延迟了


是结果显示没有问题,我说滴问题是, 如果达不到delay的数量,就不会写到数据库。你的数据库,就永远不会有值。你的值是保存在cache中,例如:排序等工作就会出现问题。


确实会有排序的问题
不过我认为这个应用还是看实际的应用情况的,一般只用把延迟是到20左右就好了,而 20 左右的排序差距不是很在意(为了性能),另外基本上很少会用到使用 访问量 来作为排序的(我们的情况,除非是某个栏目文章很热门的,而让有热门度的时候访问量更新就不是问题了),反而大部分是使用回复数

反过来说,如果页面一分钟(或者说一定时间内)都达不到 delay 设置的那么多 views_count ,那么你是否应该把 delay 改小或者去掉呢?

这个不只是为了延迟,而是为了减少高访问量的时候数据库写入的次数

不过延迟时间也是可以增加的方案
6 楼 edisonlz 2010-01-18  
huacnlee 写道
edisonlz 写道
问题: 如果达不到delay的数量,那view_count 不会被赋值,一直为0,例如一篇很普通的文章,view_count很小,所以该篇文章的view_count一直为0。
建议:将delay的数量改为时间,

例如: :delay=>5,就是代表5分钟同步到数据库。如果为0则不同步。

但是,在实际应用中,因为要更新view_count的业务逻辑会复杂一下,建议使用消息队列完成此类工作。


可能你没有理解到,用于显示的不是 views_count 而是 views_count_s (acts_as_views_count 里面封装的,它的值是 Cache 里面dalay的数字 + 数据库里面存放的数字)
用这个并不会影响最终的显示结果,只是仅仅把写入数据库延迟了


是结果显示没有问题,我说滴问题是, 如果达不到delay的数量,就不会写到数据库。你的数据库,就永远不会有值。你的值是保存在cache中,例如:排序等工作就会出现问题。
5 楼 huacnlee 2010-01-18  
edisonlz 写道
问题: 如果达不到delay的数量,那view_count 不会被赋值,一直为0,例如一篇很普通的文章,view_count很小,所以该篇文章的view_count一直为0。
建议:将delay的数量改为时间,

例如: :delay=>5,就是代表5分钟同步到数据库。如果为0则不同步。

但是,在实际应用中,因为要更新view_count的业务逻辑会复杂一下,建议使用消息队列完成此类工作。


可能你没有理解到,用于显示的不是 views_count 而是 views_count_s (acts_as_views_count 里面封装的,它的值是 Cache 里面dalay的数字 + 数据库里面存放的数字)
用这个并不会影响最终的显示结果,只是仅仅把写入数据库延迟了
4 楼 edisonlz 2010-01-15  
问题: 如果达不到delay的数量,那view_count 不会被赋值,一直为0,例如一篇很普通的文章,view_count很小,所以该篇文章的view_count一直为0。
建议:将delay的数量改为时间,

例如: :delay=>5,就是代表5分钟同步到数据库。如果为0则不同步。

但是,在实际应用中,因为要更新view_count的业务逻辑会复杂一下,建议使用消息队列完成此类工作。
3 楼 huacnlee 2010-01-15  
Hooopo 写道
貌似有问题呀,如果页面使用了缓存,action就不会被执行(比如page_cache)。那么这句也就没意义了:
@post.update_views_count


而view里的代码在缓存以后也不能被执行(当然这个可以用片段缓存解决)...


你们都用 cache_page 或 cache_action 来做页面缓存吗?
我这不是,基本上都是局部缓存或Model缓存的
2 楼 Hooopo 2010-01-15  
貌似有问题呀,如果页面使用了缓存,action就不会被执行(比如page_cache)。那么这句也就没意义了:
@post.update_views_count


而view里的代码在缓存以后也不能被执行(当然这个可以用片段缓存解决)...
1 楼 ywencn 2010-01-15  
额,似乎不错。挺实用的。

相关推荐

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    acts_as_authenticated

    "acts_as_authenticated" 是一个经典的Ruby on Rails插件,它为Rails应用提供了用户认证功能。在Rails框架中,用户认证通常涉及验证用户身份、管理会话以及处理登录和登出等操作。acts_as_authenticated插件简化了这...

    用acts_as_rateable实现简单的打分功能

    在Ruby on Rails框架中,`acts_as_rateable`是一个非常实用的插件,它允许用户对模型进行评分,从而实现简单的打分功能。这个插件是Rails社区中的一个开源项目,旨在简化应用中的评分系统集成。在本篇讨论中,我们将...

    acts_as_paranoid

    "acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...

    acts_as_nested_set的增强版BetterNestedSet

    《深入理解BetterNestedSet:acts_as_nested_set的增强版》 在Ruby on Rails开发中,数据结构的选择对于数据库操作的效率至关重要。其中,Nested Set模型是一种常用的数据组织方式,尤其适用于管理具有层级关系的...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    使徒行传 一个Rails插件来添加软删除。...用法安装gem: gem 'acts_as_paranoid' , '~&gt; 0.7.0' bundle install创建迁移bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index启用ActsAs

    rails_plugins_presentation.pdf

    通过本文对Rails插件的深入解析,我们不仅了解了如何安装和管理插件,还具体介绍了几个实用的插件,包括tabnav、acts_as_authenticated、file_column和acts_as_state_machine,这些插件涵盖了导航、用户认证、文件...

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    inspinia admin - v2.5 Rails_Full_Version

    2. **Rails框架**:了解Rails的MVC(Model-View-Controller)架构,以及路由、模型、控制器、视图之间的关系。 3. **ActiveRecord**:Rails中的ORM(对象关系映射)工具,用于处理数据库操作。你需要熟悉数据库模型...

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_xapian:Xapian全文搜索插件,适用于Ruby on Rails

    《acts_as_xapian:为Ruby on Rails打造的Xapian全文搜索引擎插件》 在Web开发领域,全文搜索引擎能够极大地提升用户对信息的检索效率,对于内容丰富的应用尤其重要。Ruby on Rails作为流行的Web框架,有着众多的...

    acts_as_aliased:扩展 ActiveRecord

    rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as_aliased在模型中启用别名: model ...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    $ rails generate acts_as_liked 并且不要忘记迁移您的数据库 $ rake db:migrate 用法 可爱的模特 将acts_as_likeable添加到任何模型,它的实例可以被其他模型喜欢。 class Post &lt; ActiveRecord :: Base ...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    作为可评论行为(现在有评论线程(TM)!!!——在(TM)上开玩笑) 允许将线程注释添加到多个不同的模型。 与acts_as_commentable 兼容(但需要更改数据库架构) ... rails generate acts_as_commentable_with_

    acts_as_restful_list:就像acts_as_list一样,但很安静

    acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板.zip

    rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...

    acts_as_favoritable:该插件提供了一种跟踪用户收藏夹的简单方法

    $ rails generate acts_as_favoritable:migration $ rake db:migrate 用法 有利模式 贡献 叉它 创建功能分支( git checkout -b my-new-feature ) 提交更改( git commit -am 'Add some feature' ) 推送到分支...

    偏执狂:Rails 3、4和5的acts_as_paranoid

    偏执狂将继续接受错误修复并支持Rails的新版本,但不接受新功能。 偏执狂 偏执狂是Rails 3/4/5的的重新实现,使用的代码少得多。 当您的应用程序使用偏执狂时,在ActiveRecord对象上调用destroy并不会真正破坏...

Global site tag (gtag.js) - Google Analytics