Ahoy gem不会在Visit中存储位置数据

时间:2017-06-27 02:58:06

标签: ruby-on-rails ruby ahoy

我在我的rails var str = "/api/GetPatient/GetPatient/" + $('#name1').val(); var r = $.get(str, function (data) { $("h3").append("You are looking for " + data.name + " ?") },"json"); / ruby​​ <h3>应用程序中安装了ahoy_matey gem,并将4.2.62.3.1代码放在我的{{1}中}}。

由于某些原因,没有任何位置数据被保存到访问中。有没有人知道为什么?我在宝石问题上找不到任何东西。

1 个答案:

答案 0 :(得分:0)

免责声明

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

我的应用程序环境

我的问题

为了给您背景知识和一些视角,我想创建一个交互式3D地球仪,以帮助在地理上可视化应用程序使用情况。为了实现这一点,我知道我需要启用Ahoy的地理位置功能。我最初的计划只是按国家/地区进行可视化,因此我只是想了解访问来源国。我很快发现,我遇到了两个问题。...

  1. 在以下字段中没有显示任何数据:

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

    • 纬度(数据类型:浮动)
    • 经度(数据类型:浮动)

为帮助教育那些可能不是红宝石的人,这里列出了我最初采取的步骤,以找出问题并进行更改后进行故障排除:

打开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

接下来,我需要发现为什么未填充地理位置数据。最终导致我在上面列出的\..\config\sidekiq.yml gem所用的配置文件Sidekiq-Scheduler中为 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 Documentation,我发现Ah​​oy的默认队列是ahoy,这对我来说很有意义。因此,在这一点上,我有两个选择。

  1. 我可以更改Ahoy的默认队列,并使用已经创建的队列low (请参见上面的sidekiq-scheduler配置)。我只需要在Ahoy.job_queue = :low的配置文件中添加Sidekiq,该文件位于此处> \..\config\intializers\ahoy.rb
  2. 或者我可以保留默认的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