【问题标题】:Decoupling Location from Users and Rails Geocoder将位置与用户和 Rails 地理编码器分离
【发布时间】:2021-05-13 11:49:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord rails-geocoder


    【解决方案1】:

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

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

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

    dkniffin 提供以下范围。

    【讨论】:

    • 这实际上也是我最终的结果......我想我可能会做的就是改为这样的东西:`` class LocationUpdate include Interactor def call context.location.update( params) context.location.user.update_columns(params) end end ``` 这样我仍然可以按位置搜索用户而不破坏序列化缓存,但可以继续独立更新/提供位置数据.
    【解决方案2】:

    我最近遇到了同样的问题,在我的情况下,我有一个 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])
    

    【讨论】:

    • 非常接近我所使用的...我最终也通过update_columns 继续在用户对象上设置纬度/经度,这样我就不会破坏缓存,但可以查询直接
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2018-08-25
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2020-11-13
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多