将位置与用户和 Rails 地理编码器分离

Decoupling Location from Users and Rails Geocoder

在我们的应用程序中,我们最初有 latitude/longitude 的用户记录,并且效果很好。随着我们变得越来越大,越来越多的人使用它,位置 updates/checks 的数量也越来越大,我认为我们可以通过将位置与用户记录分离来减轻负载:可以独立于用户更新和检查位置记录而不吹走用户数据上的序列化程序缓存我们每隔 X 秒更新一次位置...

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

我试过 User.some_scopes.joins(:location).merge(Location.near(@geocoded_record)) 但是 returns 一个带有“用户记录”的 ActiveRecord_Relation 只包含 nil id、纬度和经度...这在申请时不会发生由于某种原因,任何其他类型的 scope/query 到 Location 合并。

所以...任何人都可以通过关联获取按距离排序的用户记录到地理编码记录的最佳方法,而无需返回到 latitude/longitude 直接在用户上?

joinsnear 使用 Geocoder 会产生一些意想不到的结果。

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

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

dkniffin 提供以下范围。

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

旅行范围:

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])