2017-08-03 26 views
1

它的工作原理,如果地址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

地理编码器需要知道哪些列商店的纬度和经度,或如何让位置的情况下做任何计算。所以你需要设置geocoded_byreverse_geocoded_by。 (原因是如果不知道这些信息中的任何一个,地理编码器无法知道您的对象的位置,因此无法计算任何对象与您提供的位置之间的距离)。

+0

绝对,然后它给了我这个错误 - NoMethodError(未定义的方法'附近'的#Class:#):当它不使用反向地理编码 - #reverse_geocoded_by,因为它不需要。 – srs

+0

当我不使用#reverse_geocoded_by或我将其注释掉时出现错误 – srs

+0

对,如果您想使用'Locate.near'中的坐标,您确实需要'#reverse_geocoded_by'。如果你不想使用'#reverse_geocoded_by',那么你需要使用地址而不是坐标。 – EJ2015

0

Geocoder不会将这些范围方法添加到每个模型。它要求你要么geocoded_byreverse_geocoded_by添加到您的模型,如果你想让它获得地理编码方法和范围类似.near.geocoded等..

拨打电话到这两个类的宏之一是钩用这些方法配置您的模型的地理编码选项和extends。再次,Geocoder确实不是直接将这些方法添加到ActiveRecord :: Base,并通过扩展您的应用程序中的每个模型。 Geocoder的确如此,而不是只需从您的架构中latitude:float longitude:float的存在推断出您希望该模型为“可地理编码”。地理编码器不会而不是在任何表格中查找这些列。

这是最起码的,你必须做的就是你正在寻找

reverse_geocoded_by :latitude, :longitude 

认为它是这样的功能:如果您添加post_id:integerComment模型,你自动获得一个#post方法?不,您必须明确添加belongs_to :post。这是完全一样的想法。