ruby Ahoy gem未在Visit中存储位置数据

zi8p0yeb  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(123)

我在rails 4.2.6/ruby 2.3.1应用程序中安装了ahoy_matey gem,并将ahoy.trackAll();//= require ahoy代码放在了application.js中。
由于某种原因,没有任何位置数据被保存到访问。有人知道为什么吗?我在gem的问题中找不到任何东西。

m528fe3b

m528fe3b1#

免责声明

几个月前,我在申请时遇到了同样的问题。我知道这个问题几年前就被问到了,但我想花点时间分享一下我为解决这个问题所做的努力。

我的应用环境

  • 操作系统:Ubuntu 18.04(AWS C9)
  • Rails * 版本:5.2.4*
  • Ruby版本:2.6.1
  • 数据库:PostgreSQL 10.12
  • 活动作业后台:* Sidekiq 6.0.2 *
  • Sidekiq的其他宝石
  • Sidekiq-Scheduler 3.0.0

我的问题

为了给予你背景和一些观点,我想创建一个交互式的3D地球仪,这将有助于可视化地理应用程序的使用.为了实现这一点,我知道我需要启用Ahoy的地理定位功能.我最初的计划只是要可视化它的国家,所以我只是试图得到的国家,其中访问起源.我很快发现的是,我有两个问题.

*Ahoy在以下字段中未显示任何数据:

  • 国家 (数据类型:字符串)
  • 区域 (数据类型:字符串)
  • 城市 (数据类型:字符串)
    *我在数据库中缺少以下与地理位置相关的字段。它们未显示在schema中。rb
  • 纬度 (数据类型:浮点型)
  • 经度 (数据类型:浮点型)

为了帮助教育那些可能是ruby on rails新手的人,这里列出了我最初识别问题的步骤,并在进行更改后进行故障排除:
打开Rails控制台。

rails c

字符串
查询数据库(ActiveRecord)中的Ahoy访视记录。

Ahoy::Visit.first


返回以下哈希值。(出于明显的隐私考虑,以下哈希值中的某些值被替换为“.....”)

=> #<Ahoy::Visit id: 1, visit_token: "687e8c98-1466-4adc-9224-15b4f8df18be", visitor_token: "819f2a25-a8ce-4f7b-a19b-07181e1fcc53", user_id: 1, ip: ".....", user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb...", referrer: ".....", referring_domain: ".....", landing_page: ".....", browser: "Chrome", os: "Windows", device_type: "Desktop", country: nil, region: nil, city: nil, utm_source: nil, utm_medium: nil, utm_term: nil, utm_content: nil, utm_campaign: nil, app_version: nil, os_version: nil, platform: nil, started_at: "2019-06-24 15:32:33", latitude: nil, longitude: nil>

解决我的问题

我做的第一件事是创建一个迁移,将缺失的latitudelongitude列添加到数据库(* 不确定为什么会缺失 *). Creating Ruby on Rails Migrations

rails generate migration AddLatitudeAndLongitudeToAhoyVisits latitude:float longitude:float


现在,随着迁移的创建,我运行了以下命令来更新数据库:

rails db:migrate


接下来,我需要找出为什么地理位置数据没有被填充。最终,我在上面列出的Sidekiq-Scheduler gem的配置文件\..\config\sidekiq.yml中为 Sidekiq 配置了3个队列。下面是我配置的内容:

:schedule:
  Acknowledged Notification Deletions:
    cron: '0 * * * *'   # Runs every hour
    class: NotificationsCleanupJob
    description: "This job runs every hour cleaning up all notifications that have been acknowledged by users." 

  Certificate Renewal Notfications:
    cron: '0 0 1 * *'   # Runs on the first of every month at midnight.
    class: CertificateRenewalNotificationJob
    description: "This job checks the renewal status of user certs and sends an email notification when expiration is within 30 days." 

:concurrency: 30
:dynamic: true
:queues:
  - critical
  - default
  - low


阅读回Sidekiq文档,我发现Ahoy的默认队列是ahoy,这对我来说很有意义。所以在这一点上我有两个选择。
1.我可以更改Ahoy的默认队列,并使用已经创建的队列low(参见上面的sidekiq-scheduler配置)。我只需要在Sidekiq的配置文件中添加Ahoy.job_queue = :low,位于> \..\config\intializers\ahoy.rb
1.或者,我可以保留Ahoy默认队列ahoy,只将其作为配置队列添加到Sidekiq-Scheduler配置文件\..\config\sidekiq.yml中,位于底部的:queues:部分下。因此,它看起来像这样:

:schedule:
  Acknowledged Notification Deletions:
    cron: '0 * * * *'   # Runs every hour
    class: NotificationsCleanupJob
    description: "This job runs every hour cleaning up all notifications that have been acknowledged by users." 

  Certificate Renewal Notfications:
    cron: '0 0 1 * *'   # Runs on the first of every month at midnight.
    class: CertificateRenewalNotificationJob
    description: "This job checks the renewal status of user certs and sends an email notification when expiration is within 30 days." 

:concurrency: 30
:dynamic: true
:queues:
  - critical
  - default
  - low
  - ahoy


我最终选择了选项2。在实现更改后,我重新启动了应用程序和Sidekiq示例。在观看Sidekiq示例终端时,我重新访问了应用程序,并立即开始看到Ahoy的以下作业启动:

2020-04-20T15:23:46.733Z 4520 TID-gmuxo38gc Ahoy::GeocodeV2Job JID-1e053ab2e237431d0cfcb9b2 INFO: start
2020-04-20T15:23:46.796Z 4520 TID-gmuxo38gc Ahoy::GeocodeV2Job JID-1e053ab2e237431d0cfcb9b2 INFO: done: 0.062 sec


之后,我验证了我确实在数据库中看到了地理位置数据,我决定创建一些代码在rails控制台中运行,以更新所有当前没有地理数据的先前访问。在我的情况下,只有大约700次访问 (~30秒更新),所以我并不担心试图咀嚼更多,我可以吞下。您可以根据需要修改,如果您有大量的访问,需要更新。只需复制,粘贴到rails控制台并运行它。

#- Gather all visits with nil longitude, this should suffice.
visits = Ahoy::Visit.where(:longitude => nil)

#- Iterate over each visit in visits and queue the GeocodeJob to get the geodata
#- and update the record.
visits.each do |visit|
    #- This job actually queues another job called GeocodeV2Job that does the actual lookup.
    Ahoy::GeocodeJob.perform_now(visit)
end

x6h2sr28

x6h2sr282#

要启用地理编码,请将此行添加到应用程序的Gemfile中:

gem "geocoder"

字符串
然后更新config/initializers/ahoy.rb

Ahoy.geocode = true


地理编码在后台作业中执行,因此不会降低Web请求的速度。默认作业队列为:ahoy。将其更改为:

Ahoy.job_queue = :low_priority


重新启动rails服务器:

$ rails s


运行后台服务:

$ sidekiq


Here更详细。

相关问题