0

我将ahoy_mateygem 安装在我的 rails 4.2.6/ruby2.3.1应用程序中,并将ahoy.trackAll();代码//= require ahoy放在我的application.js.

出于某种原因,没有任何位置数据被保存到访问中。有人知道为什么吗?我在 gem 的问题中找不到任何东西。

4

1 回答 1

0

免责声明

几个月前,我的申请也遇到了同样的问题。我知道这个问题是几年前提出的,但我想花点时间分享我为解决问题所做的工作。

我的应用环境

我的问题

为了给你一些背景和一些观点,我想创建一个交互式 3D 地球,这将有助于在地理上可视化应用程序的使用。为了实现这一点,我知道我需要启用 Ahoy 的地理定位功能。我最初的计划只是按国家/地区对其进行可视化,因此我只是试图获取访问的来源国家/地区。我很快发现我有两个问题......

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

    • 国家(数据类型:字符串)
    • 区域(数据类型:字符串)
    • 城市(数据类型:字符串)
  2. 我在数据库中缺少以下与地理位置相关的字段。他们没有出现在 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> 

解决我的问题

我做的第一件事是创建一个迁移以将缺失的latitude列添加longitude到数据库中(不确定它们为什么缺失)。创建 Ruby on Rails 迁移

rails generate migration AddLatitudeAndLongitudeToAhoyVisits latitude:float longitude:float

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

rails db:migrate

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

: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 配置)。我只需要Ahoy.job_queue = :low在配置文件中添加Sidekiq,位于此处 > \..\config\intializers\ahoy.rb
  2. 或者我可以保留 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
于 2020-04-20T20:29:21.500 回答