2017-08-03 24 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。這是完全一樣的想法。