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)
答案 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。这也允许灵活性,因此如果您想要跟踪用户视图,如果他们每周查看一次或其他任何内容。