我找到了解决这个问题的几种解决方案,例如这篇文章中的railstat:
我有很多文章和评论,我想要一个按唯一 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/