геокодер рядом с методом выдает ошибку

Это работает, если address и 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:#):

person srs    schedule 03.08.2017    source источник


Ответы (2)


Geocoder должен знать, в каких столбцах хранятся широта и долгота, или как получить местоположение экземпляра для выполнения каких-либо вычислений. Поэтому вам нужно установить либо geocoded_by, либо reverse_geocoded_by. (причина в том, что, не зная ни одной из этих сведений, геокодер не может знать местоположение ваших объектов, поэтому не может рассчитать расстояние между любыми объектами и вашим указанным местоположением).

person EJAg    schedule 03.08.2017
comment
Абсолютно верно, а потом выдает эту ошибку - NoMethodError (неопределенный метод `near' для #Class:#): когда не использует обратное геокодирование - #reverse_geocoded_by как бы не нужно. - person srs; 04.08.2017
comment
Ошибка возникает, когда я не использую #reverse_geocoded_by или комментирую его - person srs; 04.08.2017
comment
Итак, вам нужно #reverse_geocoded_by, если вы хотите использовать координаты в Locate.near. Если вы не хотите использовать #reverse_geocoded_by, вам нужно использовать адрес, а не координаты. - person EJAg; 04.08.2017
comment
в основном, вы имеете в виду, что #near(адрес, 5, единицы:: км) должен иметь первый параметр адрес, чем [center.latitude, center.longitude] - person srs; 04.08.2017
comment
извините, я только что проверил исходный код и ошибся. Не нужно вызывать обратное геокодирование, когда вы указываете координаты. Вместо этого вам нужно добавить geocoded_by - person EJAg; 04.08.2017
comment
Зачем? просто объясни - person srs; 04.08.2017
comment
Давайте продолжим обсуждение в чате. - person EJAg; 04.08.2017
comment
У меня есть t.float:latitude и t.float:longitude в модели Locate. #reverse_geocoded_by и geocoded_by предназначены для сопоставления широты и долготы с адресом улицы и наоборот. но поскольку я получаю их от мобильного GPS, я хочу сохранить ограниченные вызовы геокодирования для размещения api (google, bing и т. д.) вместо вызова #near со значениями [широта, долгота] - person srs; 04.08.2017

Geocoder не добавляет эти методы области действия к каждой модели. Это требует, чтобы вы добавили geocoded_by или reverse_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. Это точно такая же идея.

person m. simon borg    schedule 04.08.2017