Mise à JOUR
Le code de cette réponse a été utilisé comme une base pour http://github.com/charlotte-ruby/impressionist
L'essayer
Il serait sans doute vous prendre moins de temps pour ce code dans votre application, alors il serait pour extraire les données à partir de google Analytics en utilisant leur API. Ces données serait le plus susceptible d'être plus précis et vous n'aurait pas à invoquer un externe de dépendance.. aussi vous aurait les stats en temps réel au lieu d'attendre 12 heures sur les données de google Analytics. request.remote_ip
fonctionne assez bien. Voici une solution en utilisant le polymorphisme. Veuillez noter que ce code n'est pas testé, mais il devrait être proche.
Créer un nouveau modèle de migration/pour stocker vos pages vues (impressions):
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
Ajouter une ligne à votre modèle Article pour l'association, et ajouter une méthode retourne le nombre d'impressions:
class Article < ActiveRecord::Base
has_many :impressions, :as=>:impressionable
def impression_count
impressions.size
end
def unique_impression_count
impressions.group(:ip_address).size #UNTESTED: might not be correct syntax
end
end
Créer un before_filter pour articles_controller sur la fin de l'action:
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
Ensuite vous suffit d'appeler le unique_impression_count de votre point de vue
<%=@article.unique_impression_count %>
Si vous êtes en utilisant ce sur un tas de modèles, vous pouvez SÉCHER jusqu'. Mettre le before_filter def dans application_controller et d'utiliser quelque chose de dynamique, comme:
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)
Et aussi passer le code dans le modèle Article à un module qui sera inclus dans ActiveRecord::Base. Vous pourriez mettre les envoyer inclure dans un fichier config/initialiseur.. ou si vous souhaitez devenir fou, il suffit de tourner la chose dans un moteur rails, de sorte que vous pouvez les réutiliser sur d'autres applications.
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