将位置与用户和 Rails 地理编码器解耦

问题描述

在我们的应用程序中,我们最初有包含纬度/经度的用户记录,并且运行良好。随着我们变得更大并且有更多的人使用它,位置更新/检查的数量变得越来越大,我认为我们可以通过将位置与用户记录解耦来减轻​​负载:可以独立于用户记录更新和检查位置而无需我们每 X 秒更新一次位置,就清除用户数据上的序列化器缓存......

然而,这导致了一个有趣的问题:当我们试图在某个位置附近找到用户时,我们现在有点搞砸了。当纬度/经度与用户耦合时,您可以简单地执行 User.near(@geocoded_record) 并拥有用户的距离排序列表。由于位置是独立的,它变得越来越难,我正在寻找有关如何正确查询的建议。

我尝试过 User.some_scopes.joins(:location).merge(Location.near(@geocoded_record)) 但它返回一个带有“用户记录”的 ActiveRecord_Relation,其中只包含一个 nil id、纬度和经度......在应用任何其他类型的范围时不会发生这种情况/出于某种原因查询位置合并。

所以...有人对通过关联获取按距离排序的用户记录到地理编码记录的最佳方法有什么建议,而无需返回直接在用户上使用纬度/经度吗?

解决方法

joinsnear 与 Geocoder 产生一些意想不到的结果。

我们遇到了同样的问题,并创建了一个范围,这对我们来说似乎很好。

https://github.com/alexreisner/geocoder/issues/627

dkniffin 提供以下范围。

,

我最近遇到了同样的问题,在我的例子中,我有一个 Travel 模型和一个 Destination 模型,其中包含旅行的经纬度值。我终于让它像那样工作了,在优化方面可能不是最好的:

旅行范围:

scope :near_of,->(target_lat,target_lng) { joins(:destination).merge(Destination.near([target_lat,target_lng],3)) }

和控制器:

travels = Travel.includes(:destination).near_of(params[:destination_latitude],params[:destination_longitude])