2015-12-15 54 views
3

我有两个关于gem 'geokit-rails'Geokit Rails的距离,找到(:所有)

问题,这是我的示例代码

class Outlet < ActiveRecord::Base 
    acts_as_mappable :lat_column_name => :address_latitude, 
        :lng_column_name => :address_longitude, 
        :default_units => :kms 
end    
  1. 我不能使用find(:所有)

    样本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. 距离。我真的不明白这是如何工作的。我们应该将距离列添加到插座模型中吗?如果是,列类型是什么?并且可以根据给定的经度值返回距离值的记录吗? Outlet.by_distance(:origin =>[32.951613, -96.958444]) 它将返回距离该点的记录。 (2千米,3kms,4公里,...)

回答

0
  1. find是一个ActiveRecord方法。 它与Geokit无关。它的型号为id,例如1用于您创建的第一个Outlet或用于第二个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)