contador de visitas simple para páginas vistas en Rails

He encontrado varias soluciones para este problema, por ejemplo railstat desde esta publicación:

Páginas vistas en Rails

Tengo un montón de artículos y reseñas que me gustaría que un contador de visitas filtrara por direcciones IP únicas. Exactamente como Stackoverflow lo hace para esta publicación. Pero realmente no me importa una solución como railstat cuando Google Analytics ya está haciendo esto por mí e incluye una gran cantidad de código, haciendo un seguimiento de las direcciones IP únicas, etc. Mi pensamiento actual es usar Garb o algún otro Analytics Complemento para extraer las páginas de las estadísticas si son más antiguas que 12 horas para actualizar alguna tabla, pero también necesito una cache_column.

Supongo que puede extraer estadísticas de Analytics para una página en particular y que actualicen sus estadísticas cada 12 horas.

Me pregunto si hay alguna razón por la cual esta sería una mala idea, o si alguien tiene una mejor solución.

Gracias

ACTUALIZAR

El código en esta respuesta se utilizó como base para http://github.com/charlotte-ruby/impressionist Pruébelo


Probablemente le tome menos tiempo codificar esto en su aplicación y luego extraer los datos de Analytics usando su API. Es muy probable que esta información sea más precisa y no tendría que depender de una dependencia externa … también tendría las estadísticas en tiempo real en lugar de esperar 12 horas en los datos de Analytics. request.remote_ip funciona bastante bien. Aquí hay una solución que usa polymorphism. Tenga en cuenta que este código no se ha probado, pero debe estar cerca.

Cree un nuevo modelo / migración para almacenar sus visitas a la página (impresiones):

 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 

Agregue una línea a su modelo de artículo para la asociación y agregue un método para devolver el recuento de impresiones:

 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 

Crea un before_filter para articles_controller en la acción show:

 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 

Luego, simplemente llama a unique_impression_count en tu vista

 < %=@article.unique_impression_count %> 

Si está utilizando esto en un grupo de modelos, es posible que desee SECAR. Coloque la definición de before_filter en application_controller y use algo dynamic como:

 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) 

Y también mueva el código en el modelo de Artículo a un módulo que se incluirá en ActiveRecord :: Base. Podría poner el envío incluido en una configuración / inicializador … o si quiere volverse loco, simplemente conviértalo todo en un motor de Rails, para poder reutilizarlo en otras aplicaciones.

 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