在rails中简单的点击浏览页面

我发现这个问题的几个解决scheme,例如railstat从这个职位:

Rails中的页面浏览

我有一堆的文章和评论,我想按独特的IP筛选的计数器。 完全像Stackoverflow这个职位。 但是,我并不真正关心railstat这样的解决scheme,当谷歌分析已经为我做了这个,包括大量的代码,跟踪独特的IP等等。我现在的想法是使用Garb或其他一些分析插件来拉的页面统计如果他们比12个小时更新某​​些表,但我也需要一个cache_column。

我假设您可以从Google Analytics(分析)中为某个特定网页提取统计信息,并且他们每12小时更新一次统计信息?

我想知道是否有任何理由为什么这是一个坏主意,或者如果有人有一个更好的解决scheme?

谢谢

UPDATE

这个答案中的代码被用作http://github.com/charlotte-ruby/impressionist的基础。试一下;


这可能会花费更less的时间将代码编写到您的应用程序中,然后使用API​​从Google Analytics中提取数据。 这些数据很可能会更准确,而且您不必依靠外部依赖性。您也可以实时获得统计信息,而不必等待Google Analytics数据12小时。 request.remote_ip工作得很好。 这是一个使用多态的解决scheme。 请注意,这段代码没有经过testing,但应该很接近。

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

 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 

在show动作上为articles_controller创build一个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 

然后,您只需在您的视图中调用unique_impression_count

 <%=@article.unique_impression_count %> 

如果你在一堆模型上使用这个,你可能想干掉它。 将before_filter def放在application_controller中,并使用如下的dynamic内容:

 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中的模块中。 你可以把send包放在一个configuration/初始化器中,或者如果你想变得疯狂的话,把整个事情变成一个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