创建简单的点击计数器

时间:2014-03-25 01:51:35

标签: ruby-on-rails

def show
   Bottle.increment_counter :views, @bottle
end

效果很好,但是如果同一个人一遍又一遍地看到它会不断增加。我该如何解决这个问题,所以只有独特的命中才能增加它?

我应该拥有ip型号并制作我的瓶子模型have_many ips,ips是访问它的人的那个吗?然后,做某事这个? (我将它提取到类方法中,但这只是为了向您展示):

def show
   if !@bottle.ips.include?(request.remote_ip)
       Bottle.increment_counter :views, @bottle
       Ip.create(bottle_id: @bottle, ip: request.remote_ip )
   end
end

我认为以上方法可行,但这不会导致数据库填满非常非常快吗?或者,这是一种练习吗?如果这不是一种做法,我怎么能以某种方式对cookie做同样的事情呢? Cookie的结构是什么?

另外,我知道有一堆点击计数宝石,但我想自己这样做(在你的帮助下:P)

2 个答案:

答案 0 :(得分:2)

请求IP地址的事情是,您可以为同一网络中的每个人(即您可能看到的IP地址)拥有相同的IP地址,即使他们的网络内部,他们每个人显然都有他们自己的IP地址。

...在您的控制器中

def show
  # see if they already have a cookie, if so
  # it will create a cookie with the Hit id you created
  if cookies.has_key?(:unique_hit_key)
    hit = Hit.find(cookies[:unique_hit_key])
    hit.count = hit.count.to_i+1
    hit.save
  else
    cookies[:unique_hit_key] = {
      :value => Hit.create(count: 1).id,
      :expires => 1.year.from_now,
      :domain => 'domain.com'
    }
  end
end

这不会跟踪IP,但您真的不需要它。如果您没有看到,则会根据您设置的Cookie统计所有访问者的数量。这是松散的假设,你不必担心人们擦除他们的cookie。如果您需要更好地控制它,您可能需要通过登录等跟踪。

答案 1 :(得分:0)

我会将其设置为Cookie,您可以查看如何执行此操作here。这也允许灵活性,因此如果您想要跟踪用户视图,如果他们每周查看一次或其他任何内容。