37 votes

compteur d'accès simple pour les pages vues dans les rails

J'ai trouvé plusieurs solutions à ce problème, par exemple railstat de ce post:

Pages vues dans les Rails

J'ai un tas d'articles et de commentaires que je voudrais un compteur d'accès filtré par des IPs. Exactement comme Stackoverflow pour ce post. Mais je n'ai pas vraiment de soins pour une telle solution railstat quand google analytics est déjà de le faire pour moi et y compris tout un tas de code, gardant la trace de l'unique IPs, etc.. l'heure actuelle, Ma pensée est d'utiliser un Costume ou une autre Analytics plugin pour tirer les pages de stats si ils sont plus âgés que dire 12 heures de mise à jour d'une table, mais j'ai aussi besoin d'un cache_column.

Je suis en supposant que vous pouvez tirer des stats Analytics pour une page en particulier et de mettre à jour leurs statistiques, toutes les 12 heures?

Je me demande s'il y a des raisons pourquoi ce serait une mauvaise idée, ou si quelqu'un a une meilleure solution?

Merci

93voto

cowboycoded Points 7505

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X