2010-09-01 98 views
1

我需要實現產品頁面訪問統計(按天)。如何更好地在Rails中做到這一點?頁面訪問統計

+0

如果您有內部FQDN,您可以使用:google.com/analytics,如果您擁有可公開訪問的網址 - 無論如何您都很好。 – kd7 2010-09-01 18:39:10

+0

順便提一下,我的評論是,如果你想使用一個現成的解決方案,如果你想推出自己的自定義分析片段的應用程序是完全無法訪問的外部世界,並且不能使用谷歌的跟蹤代碼,請忽略我的評論。 – kd7 2010-09-01 18:45:56

+0

我需要用戶的公共統計信息。 我在考慮GA,但我擔心它是QUTU政策。 – alexandr 2010-09-01 19:23:27

回答

1

的快速和骯髒的方式來構建內部的Rails這樣的事情是做一個跟蹤表:

create_table :product_views do |t| 
    t.integer :product_id, :null => false 
    t.date :viewed_at, :null => false 
    t.integer :views, :null => false, :default => 1 
end 

add_index :product_views, [ :product_id, :viewed_at ], :unique => true 
add_index :product_views, :viewed_at 

唯一索引將意味着你每天每個產品一個條目。對於該產品沒有任何視圖的日子將會缺失條目。這也意味着你可以使用MySQL的ON DUPLICATE KEY功能,如果這是你的後端數據庫。

可以填充這個使用單個SQL調用:

class Product 
    def self.record_view!(product_id) 
    connection.execute(
     sanitize_sql([ 
     "INSERT INTO product_views (product_id, viewed_at) 
      VALUES (?, CURRENT_DATE()) 
      ON DUPLICATE KEY UPDATE views=views+1", 
     product_id 
     ]) 
    ) 
    end 

    def record_view! 
    self.class.record_view!(self.id) 
    end 
end 

這可以在任何時候被調用,將增加1到您的計數表。你可以使用標準的SQL很容易地報告。

+0

而且還可以將統計信息寫入memcached或redis,並在午夜複製db,您怎麼看待它? – alexandr 2010-09-01 19:33:03

+0

如果你在事物的數據庫方面遇害,我只能這麼做。通常像這樣的INSERT調用在接近零的時間發生,因此需要數千個才能顯着緩慢。哪裏出現瓶頸不是記錄數據,而是將它們分組成每週或每月的報告。你需要爲這些派生值創建一個彙總表,並且可能每晚更新一次。 Memcached對於第二類網站的100多個請求來說只是非常必要的,但即使如此,如果調整得當,MySQL也可以保持良好的狀態。 – tadman 2010-09-02 02:12:18

+0

我如何根據月份和年份對訪問進行分組? – alexandr 2010-09-26 20:09:39