Я использую драгоценный камень геокодера для Ruby, который Райан Бейтс вводит в эпизоде 273 http://railscasts.com/episodes/273-geocoder?view=asciicast. В этом эпизоде он использует следующее для поиска объектов в радиусе 50 км (хотя он использует модель местоположения, где я использую модель User).Геокодер дистанционный метод не существует
@users = User.near(params[:search], 50, :order => :distance)
, когда я запускаю этот код на приложение Rails 4 с Postgres, он говорит
PG::Error: ERROR: column users.distance does not exist
В демо-приложение Райана (код здесь https://github.com/railscasts/273-geocoder/tree/master/siteseer-after) он не имеет столбец расстояния на Локаций модели (так как у меня его нет в моей модели пользователя), поэтому я предположил, что distance
был чем-то, поставляемым драгоценностью Geocoder. Однако, глядя на документы для геокодера http://rdoc.info/github/alexreisner/geocoder/master/frames, нет метода distance
, и все другие методы, подобные расстоянию, создают ту же ошибку.
Кто-нибудь знает, как я закажу результаты в этом запросе на расстоянии?
Update На геокодере страницы http://www.rubygeocoder.com/ дает этот пример использования distance
, однако, когда я пытаюсь это он говорит, что не существует для пользователя.
nearbys = Place.near("Omaha, NE", 50,
:order => "distance")
bearing = nearbys.first.bearing # => 46.12
Geocoder::Calculations.compass_point(
bearing) # => "NE"
Update
Это SQL генерируется
ActionView::Template::Error (PG::Error: ERROR: column users.distance does not exist
LINE 1: ...ngitude) * PI()/180/2), 2))) <= 50) ORDER BY "users".di...
^
: SELECT users.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI()/180/2), 2) + COS(43.7058645 * PI()/180) * COS(users.latitude * PI()/180) * POWER(SIN((-79.3687137 - users.longitude) * PI()/180/2), 2))) AS distance, CAST(DEGREES(ATAN2(RADIANS(users.longitude - -79.3687137), RADIANS(users.latitude - 43.7058645))) + 360 AS decimal) % 360 AS bearing FROM "users" WHERE (users.latitude BETWEEN 42.98220558444576 AND 44.429523415554236 AND users.longitude BETWEEN -80.36976846878524 AND -78.36765893121476 AND 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.7058645 - users.latitude) * PI()/180/2), 2) + COS(43.7058645 * PI()/180) * COS(users.latitude * PI()/180) * POWER(SIN((-79.3687137 - users.longitude) * PI()/180/2), 2))) <= 50) ORDER BY "users".distance ASC):
Что такое SQL, сгенерированный в журнале при выполнении этого запроса? SQL должен иметь столбец «расстояние», который является результатом вычисления. Это не метод, но вы должны иметь возможность заказать его. –
Я обновил OP с помощью sql. Спасибо за вашу помощь. – Leahcim
В другом месте что-то не так. SQL не должен делать «ORDER BY» user'.istance ». Это должно быть просто «ORDER BY distance». Я просто попробовал его с рельсами 3.2.13, геокодер 1.1.8 и pg 0.15.0 (postgres version 9.1.1). Что-то еще добавляет имя таблицы, которое заворачивает вас, я думаю. –