rails保存页面被查看的次数

时间:2016-08-24 12:28:42

标签: ruby-on-rails

所以我想要保存一个事件被查看过多少次。基本上这是为了帮助我命令事件的流行。

所以当我选择db行但我的searchkick选择要显示的行时,我会这样做。

所以我认为我还有其他选择,只能把它放在show方法中?

在我的节目方法(这很重要)中有什么用?

def show
  @event = Event.find(params[:id])
end

在显示视图时,最好的方法是什么?理想情况下,如果我也能拥有它,那将是惊人的,因此它是唯一的IP地址(所以有人可以垃圾邮件)

萨姆

2 个答案:

答案 0 :(得分:3)

您可以使用回调。添加名为' views'的字段到您的活动模型。 添加此过滤器:

after_action :log_impression, only: [:show]
....
def log_impression
  @event.views += 1 
  @event.save
end

更简洁的变体:

....
def log_impression
  @event.increment!(:views)
end

现在,您可以按展示次数对事件进行排序。

IP不是垃圾邮件的理想解决方案(动态IP,共享Wi-Fi等)。考虑使用IP与其他内容的组合(例如,会话,用户代理)。

有一个宝石impressionist。它会为你完成工作。

答案 1 :(得分:0)

您需要另一个带有表的模型,该表具有保存IP地址的列。然后为每个event.id实现唯一ip-addresses的逻辑。 通过传递ip-address加载事件后直接为该模型创建一个条目。 事件模型上的计数器缓存列对它来说是一个好主意。

创建名为EventView的模型,其中包含字符串列ip_address和整数event_id以引用该事件。 EventView得到belongs_to :event和 在你的控制器的show动作中你这样做:

EventView.where(event: @event, ip_address: request.env['REMOTE_ADDR']).first_or_create

这将确保每个event.id

记录每个ip地址 然后

Event模型获得has_many :event_views 通过@event.event_views.count,您可以获得唯一身份的数量