ruby-on-rails - Rails 中页面浏览量的简单点击计数器

标签 ruby-on-rails ruby-on-rails-3 google-analytics google-api counter

我找到了解决这个问题的几种解决方案,例如这篇文章中的railstat:

Page views in Rails

我有很多文章和评论,我想要一个按唯一 IP 过滤的点击计数器。就像 Stackoverflow 对这篇文章所做的那样。但我并不真正关心像railstat这样的解决方案,因为谷歌分析已经为我做到了这一点,并包括大量代码,跟踪唯一的IP等。我目前的想法是使用Garb或其他一些分析如果页面统计数据早于 12 小时更新某​​些表,则用于提取页面统计信息的插件,但我还需要一个缓存列。

我假设您可以从 Analytics 中提取特定页面的统计信息,并且他们每 12 小时更新一次统计信息?

我想知道是否有任何原因表明这是一个坏主意,或者是否有人有更好的解决方案?

谢谢

最佳答案

更新

此答案中的代码用作 http://github.com/charlotte-ruby/impressionist 的基础 尝试一下

<小时/>

与使用 API 从 Analytics 中提取数据相比,将其编码到应用程序中可能会花费更少的时间。此数据很可能会更准确,并且您不必依赖外部依赖项。您还可以实时获得统计数据,而不是等待 12 小时分析数据。 request.remote_ip 效果很好。这是使用多态性的解决方案。请注意,此代码未经测试,但应该接近。

创建新模型/迁移来存储您的页面浏览量(展示次数):

class Impressions < ActiveRecord::Base
  belongs_to :impressionable, :polymorphic=>true 
end

class CreateImpressionsTable < ActiveRecord::Migration
  def self.up
    create_table :impressions, :force => true do |t|
      t.string :impressionable_type
      t.integer :impressionable_id
      t.integer :user_id
      t.string :ip_address
      t.timestamps
    end
  end

  def self.down
    drop_table :impressions
  end
end

向您的文章模型中添加一行以进行关联,并添加一个方法来返回展示次数:

class Article < ActiveRecord::Base
  has_many :impressions, :as=>:impressionable

  def impression_count
    impressions.size
  end

  def unique_impression_count
    # impressions.group(:ip_address).size gives => {'127.0.0.1'=>9, '0.0.0.0'=>1}
    # so getting keys from the hash and calculating the number of keys
    impressions.group(:ip_address).size.keys.length #TESTED
  end
end

在显示操作上为articles_controller创建before_filter:

before_filter :log_impression, :only=> [:show]

def log_impression
  @article = Article.find(params[:id])
  # this assumes you have a current_user method in your authentication system
  @article.impressions.create(ip_address: request.remote_ip,user_id:current_user.id)
end

然后您只需在 View 中调用 unique_impression_count

<%=@article.unique_impression_count %>

如果您在一堆模型上使用它,您可能需要将其干燥。将 before_filter def 放入 application_controller 并使用动态内容,例如:

impressionable_class = controller_name.gsub("Controller","").constantize
impressionable_instance = impressionable_class.find(params[:id])
impressionable_instance.impressions.create(ip_address:request.remote_ip,user_id:current_user.id)

还将 Article 模型中的代码移动到将包含在 ActiveRecord::Base 中的模块中。您可以将发送包含在配置/初始化程序中..或者如果您想变得疯狂,只需将整个事情变成 Rails 引擎,这样您就可以在其他应用程序上重用。

module Impressionable
  def is_impressionable
    has_many :impressions, :as=>:impressionable
    include InstanceMethods
  end
  module InstanceMethods
    def impression_count
      impressions.size
    end

    def unique_impression_count
      impressions.group(:ip_address).size
    end
  end
end

ActiveRecord::Base.extend Impressionable

关于ruby-on-rails - Rails 中页面浏览量的简单点击计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815713/

相关文章:

ruby-on-rails-3 - 从轻便摩托车::集合中删除的更新 - NoMethodError:#<Moped::Collection 的未定义方法 `update'

google-analytics - GA 事件跟踪鼠标滚轮 URL 点击

ruby-on-rails - rails 渲染 :json method

javascript - 处理 CRUD 资源的 AngularJS "way"是什么

ruby-on-rails - 在 AWS Elastic Beanstalk 上使用 Docker 预编译 Assets

ruby-on-rails - Rails 3 等同于复杂的 SQL 查询

ruby-on-rails - AWS ECS 上 at_exit 中的 SignalException

ruby-on-rails - 我应该如何在生产中管理我的 gem 的二进制依赖项?

google-analytics - GA 中的 "Sessions with Event"指标很奇怪

javascript - Google Analytics 代码返回 'Undefined Function"错误