如果地址且 reverse_geocoded_by 属于我不需要的类(纬度和经度来自其他客户端),则有效。
查找5英里范围内的所有位置
Locate.near([center.latitude, center.longitude], 5)
模式
create_table :locate do |t|
t.integer :user_id
# t.string :address
t.float :latitude
t.float :longitude
t.timestamps
end
模型类
class Locate < ApplicationRecord
# reverse_geocoded_by :latitude, :longitude
# after_validation :reverse_geocode, unless: -> (obj) { obj.address.present? },
# if: -> (obj) { obj.latitude.present? and obj.latitude.present? and ( obj.latitude_changed? || obj.longitude_changed? ) }
end
控制器方法
def near
center = @user.locate
render json: Locate.near([center.latitude, center.longitude], 5, units: :km)
end
错误:
NoMethodError (undefined method `near' for #Class:#):
答案 0 :(得分:0)
Geocoder需要知道哪些列存储纬度和经度,或者如何获取实例的位置以进行任何计算。因此,您需要设置geocoded_by
或reverse_geocoded_by
。 (原因是在不知道这些信息的情况下,地理编码器无法知道对象的位置,因此无法计算任何对象与所提供位置之间的距离)。
答案 1 :(得分:0)
Geocoder不会将这些范围方法添加到每个模型中。如果您希望它获得Ge geocoded_by
,reverse_geocoded_by
等地理编码方法和范围,则需要您向模型添加.near
或.geocoded
/ p>
调用这两个类宏中的一个是使用这些方法配置地理编码选项和extends
模型的钩子。同样,Geocoder 不将这些方法直接添加到ActiveRecord :: Base,并扩展到应用程序中的每个模型。 Geocoder 不只是从您的架构中latitude:float longitude:float
的存在推断出您希望模型“可地定编码”。 Geocoder 不在任何一个表格中都会查找这些列。
这是获得您正在寻找的功能所必须做的最低限度
reverse_geocoded_by :latitude, :longitude
可以这样想:如果您将post_id:integer
添加到Comment
模型,是否会自动获得#post
方法?不,您必须明确添加belongs_to :post
。这是完全相同的想法。