Geokit Rails距离并找到(:全部)

时间:2015-12-15 07:58:42

标签: ruby-on-rails activerecord geokit

我对gem 'geokit-rails'

有2个问题

这是我的示例代码

class Outlet < ActiveRecord::Base
  acts_as_mappable :lat_column_name => :address_latitude,
                   :lng_column_name => :address_longitude,
                   :default_units => :kms
end            
  1. 我无法使用find(:all)

    示例Outlet.find(:all, :origin =>[32.951613,-96.958444], :within=>10) 它返回 ActiveRecord::RecordNotFound: Couldn't find all Outlets with 'id': (all, {:origin=>[32.951613, -96.958444], :within=>10})

    我也在此查询Outlet.find(:all)上进行了测试 它返回ActiveRecord::RecordNotFound: Couldn't find Outlet with 'id'=all

  2. 距离。我真的不明白这是如何工作的。我们应该在插座模型中添加距离列吗?如果是,那么列类型是什么?并且可以根据给定的lat lng返回带有距离值的记录吗? Outlet.by_distance(:origin =>[32.951613, -96.958444]) 它会返回与该点距离的记录。 (2公里,3公里,4公里......)

1 个答案:

答案 0 :(得分:0)

  1. find是一个ActiveRecord方法。 与Geokit 无关。对于您创建的第一个Outlet,它需要id,例如1,对于第二个Outlet,需要2。您使用了Outlet.find(:all)因此,ActiveRecord抱怨它无法找到任何ID为all的Outlet。

    我认为你真正想做的是

    Outlet.within(10, :origin => [32.951613,-96.958444])
    

    请注意,您也可以传递原始对象,例如

    @the_latest_outlet = Outlet.last
    @outlets_nearby_the_latest_outlet = Outlet.within(10, origin: @the_latest_outlet)
    
  2. 不,您不必添加列。字段distance会自动添加到ActiveRecord实例中。我还没有找到任何参数:distance_field_name的使用。我最好的猜测是,如果您的模型有一个名为distance的字段,您应该使用distance_field_name参数来避免冲突。

    2.1。如果你想测量2点之间的距离,你需要distance_to作为这个例子:

    a = Outlet.find(1)
    b = Outlet.find(2)
    distance_from_a_to_b = a.distance_to(b)
    

    2.2。 by_distance是按距离排序所有实例。

    a_place_to_compare = [lat, lng]
    all_outlets_sorted_by_distance_from_the_place = Outlet.by_distance(a_place_to_compare)