поиск близлежащего местоположения с названием страны не работает с геокодером

Я пытаюсь получить ближайших пользователей из заданного местоположения. У меня широта и долгота пользователей (беру с их адреса).

Теперь, когда я ищу такой термин, как «Северная Каролина», он показывает некоторые результаты. Но когда я ищу по названию страны «Соединенные Штаты», он должен отображать все результаты, но вместо этого он не показывает никакого результата.

Для этого я использую гем Geocoder. Вот что я делаю:

контроллер:

@user = User.near(params[:search], 20, :order => :distance)

Модель:

geocoded_by :address1 

Вид :

 Displaying all the results returned from @user

Любая идея, что я должен сделать, чтобы он возвращал все результаты, даже если я ищу по названию страны.


person Sachin Prasad    schedule 30.07.2013    source источник
comment
Будет ли это работать, если вы введете более конкретный поисковый запрос? (Нью-Йорк например?)   -  person Mike Szyndel    schedule 30.07.2013
comment
@MichaelSzyndel Да, это работает для определенных терминов, например, если я использую почтовый индекс.   -  person Sachin Prasad    schedule 30.07.2013
comment
Так какой смысл использовать геокодирование для поиска СТРАНЫ?   -  person Mike Szyndel    schedule 30.07.2013
comment
@MichaelSzyndel Разве он не должен возвращать результат, даже если я ищу его по стране? Или просто сказать, что мои пользователи не могут искать по названию страны?   -  person Sachin Prasad    schedule 30.07.2013
comment
Может быть, нет, потому что радиус США намного больше 20 миль? Или середины США нет нигде, и надо увеличивать радиус? И я думаю, что пользовательское геокодирование для чего-то, что должно храниться в БД (страна, штат, город), довольно глупо.   -  person Mike Szyndel    schedule 30.07.2013


Ответы (2)


Когда Geocoder получает что-то вроде «US», он выбирает одну пару центральных координат и затем выполняет поиск по ней. Так что в вашем случае он будет искать пользователей в пределах 20 миль от центра США.

Что вы хотите сделать, так это геокодировать поиск, а затем выяснить, какой тип ввода был (страна и т. д.)

Так, например, в вашем контроллере:

def search
  search = Geocoder.search(params[:search]).first

  if search.types.includes?('country')
    @users = User.where(country: search.address)
  else
    @users = User.near(search.coordinates, 20) # Will be ordered by distance by default
  end
end

Вы должны хранить компоненты адреса в своей базе данных.

Лучший способ получить непротиворечивые данные — запустить пользовательский обратный вызов геокодирования:

class User < ActiveRecord::Base
  geocoded_by :address do |obj, results|
    if result = results.first
      obj.street = result.street_address
      obj.zip = result.postal_code
      obj.city = result.city
      obj.country = result.country
      obj.latitude = result.latitude
      obj.longitude = result.longitude
    end
  end

  after_validation :geocode, if: :address_changed?

  def address
    "#{street}, #{zip} #{city}, #{country}"
  end

  def address_changed?
    street_changed? || city_changed? || zip_changed? || country_changed?
  end
end
person Damien    schedule 05.09.2013

Принятый ответ @delba великолепен, есть только одна небольшая опечатка, а именно, в Ruby нет предиката :includes? для массивов, а :include?. Так и должно быть search.types.include?('country').

person Vlatko Ristovski    schedule 28.03.2016
comment
На самом деле больше комментарий, но - ок. - person cramopy; 28.03.2016
comment
Дело в том, что мне нужно еще несколько баллов, чтобы на самом деле иметь возможность писать комментарии, и я не могу сделать запрос на редактирование для одного письма, поэтому я думаю, что вы понимаете мой сценарий :) - person Vlatko Ristovski; 28.03.2016