地理编码器附近方法抛出错误

时间:2017-08-03 20:40:17

标签: ruby-on-rails rails-geocoder

如果地址 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:#):

2 个答案:

答案 0 :(得分:0)

Geocoder需要知道哪些列存储纬度和经度,或者如何获取实例的位置以进行任何计算。因此,您需要设置geocoded_byreverse_geocoded_by。 (原因是在不知道这些信息的情况下,地理编码器无法知道对象的位置,因此无法计算任何对象与所提供位置之间的距离)。

答案 1 :(得分:0)

Geocoder不会将这些范围方法添加到每个模型中。如果您希望它获得Ge geocoded_byreverse_geocoded_by等地理编码方法和范围,则需要您向模型添加.near.geocoded

调用这两个类宏中的一个是使用这些方法配置地理编码选项和extends模型的钩子。同样,Geocoder 将这些方法直接添加到ActiveRecord :: Base,并扩展到应用程序中的每个模型。 Geocoder 只是从您的架构中latitude:float longitude:float的存在推断出您希望模型“可地定编码”。 Geocoder 在任何一个表格中都会查找这些列。

这是获得您正在寻找的功能所必须做的最低限度

reverse_geocoded_by :latitude, :longitude

可以这样想:如果您将post_id:integer添加到Comment模型,是否会自动获得#post方法?不,您必须明确添加belongs_to :post。这是完全相同的想法。