복붙노트

[RUBY-ON-RAILS] 레일에서 페이지 뷰에 대한 간단한 횟수 카운터

RUBY-ON-RAILS

레일에서 페이지 뷰에 대한 간단한 횟수 카운터

이 게시물에서 예를 들어 railstat이 문제에 대한 몇 가지 솔루션을 발견했습니다 :

레일의 페이지 뷰

나는 고유 한 IP에 의해 필터링 된 횟수 카운터를 원하는 기사 및 리뷰의 무리가 있습니다. 정확히 유래는이 게시물의 경우와 같은. 하지만 난 정말 이미 나를 위해이 일을하고 많은 코드를 포함, 고유의 IP를 추적 등을 유지하고 분석 구글 railstat와 같은 솔루션을 상관 없어 .. 내 현재의 생각은 의복 또는 다른 웹 로그 분석을 사용하는 것입니다 그들이 어떤 테이블을 갱신 12시간 말보다 오래된, 그러나 나는 또한 cache_column 필요한 경우 페이지 통계를 끌어 플러그인.

난 당신이 특정 페이지에 대한 웹 로그 분석에서 통계를 뽑을 수 있으리라 믿고있어 그들은 12 시간마다 자신의 통계를 업데이트하는 것이?

나는이 것에있는 이유는 나쁜 생각이 있는지 궁금하거나, 누군가가 더 나은 솔루션이있는 경우거야?

감사

해결법

  1. ==============================

    1.최신 정보

    최신 정보

    이 답변의 코드는 http://github.com/charlotte-ruby/impressionist의 기초로 사용되었다 그것을 밖으로 시도

    아마이 앱에 당신에게 코드에 시간이 덜 걸릴 것 그것은 자신의 API를 사용하여 웹 로그 분석에서 데이터를 당길 것. 이 데이터는 가장 가능성이 더 정확한 것 당신은 또한 실시간 대신에 웹 로그 분석 데이터를 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
    

    show 액션에 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
    

    그럼 당신은 당신의보기에서 unique_impression_count 전화

    <%=@article.unique_impression_count %>
    

    당신이 모델의 무리에이를 사용하는 경우, 당신은 그것을 건조 할 수 있습니다. 같은 application_controller 사용 뭔가 동적으로는 def before_filter을 넣어 :

    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)
    

    또한 액티브에 포함됩니다 모듈 :: 자료로 제 모델에서 코드를 이동합니다. 당신은에 포함 보내기를 넣을 수있는 설정 / 초기화 ... 또는 당신은 미친하려는 경우 다른 응용 프로그램에 재사용 할 수 있도록, 그냥 레일 엔진에 모든 일을 켭니다.

    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
    
  2. from https://stackoverflow.com/questions/4815713/simple-hit-counter-for-page-views-in-rails by cc-by-sa and MIT license