Ruby on rails 网页访问统计

Ruby on rails 网页访问统计,ruby-on-rails,statistics,Ruby On Rails,Statistics,我需要实现产品页面访问统计(按天)。在Rails中如何更好地做到这一点?在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

我需要实现产品页面访问统计(按天)。在Rails中如何更好地做到这一点?

在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 replicate 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很容易地报告这一点。

在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 replicate 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很容易地报告这一点。

如果您有内部FQDN,您可以使用:google.com/analytics如果您有一个可公开访问的URL-无论如何,您都很好。顺便说一句,我的评论是如果您想使用一个现成的解决方案,如果你想为外部世界完全无法访问且无法使用谷歌跟踪代码的应用程序推出自己的自定义分析,请忽略我的评论。我需要用户的公共统计数据。我在考虑GA,但我担心它是quta policy.Downvote,因为五年后没有被接受的答案如果你有一个内部FQDN,你可以使用:google.com/analytics如果你有一个可公开访问的URL-你无论如何都很好。顺便说一句,我的评论是如果你想使用一个现成的解决方案,如果你想为外部世界完全无法访问且无法使用谷歌跟踪代码的应用程序推出自己的自定义分析,请忽略我的评论。我需要用户的公共统计数据。我在考虑GA,但我担心它的quta政策。投票被否决,因为五年后没有被接受的答案,也可以在午夜将统计数据写入memcached或redis并复制到db,你怎么看?如果你在db方面被杀,我只会走这么长的路。通常像这样的
INSERT
调用发生在接近零的时间内,因此需要数千次才能达到可测量的速度。遇到瓶颈的地方不是记录数据,而是将数据分组成周报或月报。您需要为这些派生值创建一个汇总表,并可能每晚更新一次。Memcached只对第二类站点的100多个请求才是真正必要的,但即使如此,如果经过适当调整,MySQL也可以保持相当好的运行。我如何按月份和年份分组访问?您需要为这些请求创建备用列,然后专门为它们编制索引。例如,
DATE
列以月份的第一个为单位,而
year
列以整数为单位。感谢您的帮助!我如何从数据库中选择统计数据,包括“零”-天?还可以将统计数据写入memcached或redis,并在午夜将其复制到db,你怎么看?如果你在db方面被杀,我只会走这么长的路。通常像这样的
INSERT
调用发生在接近零的时间内,因此需要数千次才能达到可测量的速度。遇到瓶颈的地方不是记录数据,而是将数据分组成周报或月报。您需要为这些派生值创建一个汇总表,并可能每晚更新一次。Memcached只对第二类站点的100多个请求才是真正必要的,但即使如此,如果经过适当调整,MySQL也可以保持相当好的运行。我如何按月份和年份分组访问?您需要为这些请求创建备用列,然后专门为它们编制索引。例如,
DATE
列以月份的第一个为单位,而
year
列以整数为单位。感谢您的帮助!我如何从数据库中选择统计数据,包括“零”天?