我对gem 'geokit-rails'
这是我的示例代码
class Outlet < ActiveRecord::Base
acts_as_mappable :lat_column_name => :address_latitude,
:lng_column_name => :address_longitude,
:default_units => :kms
end
我无法使用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
距离。我真的不明白这是如何工作的。我们应该在插座模型中添加距离列吗?如果是,那么列类型是什么?并且可以根据给定的lat lng返回带有距离值的记录吗? Outlet.by_distance(:origin =>[32.951613, -96.958444])
它会返回与该点距离的记录。 (2公里,3公里,4公里......)
答案 0 :(得分:0)
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)
不,您不必添加列。字段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)