所以我想要保存一个事件被查看过多少次。基本上这是为了帮助我命令事件的流行。
所以当我选择db行但我的searchkick选择要显示的行时,我会这样做。
所以我认为我还有其他选择,只能把它放在show方法中?
在我的节目方法(这很重要)中有什么用?
def show
@event = Event.find(params[:id])
end
在显示视图时,最好的方法是什么?理想情况下,如果我也能拥有它,那将是惊人的,因此它是唯一的IP地址(所以有人可以垃圾邮件)
萨姆
答案 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
,您可以获得唯一身份的数量