2013-07-02 4 views
8

Я использую драгоценный камень геокодера для 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): 
+0

Что такое SQL, сгенерированный в журнале при выполнении этого запроса? SQL должен иметь столбец «расстояние», который является результатом вычисления. Это не метод, но вы должны иметь возможность заказать его. –

+0

Я обновил OP с помощью sql. Спасибо за вашу помощь. – Leahcim

+0

В другом месте что-то не так. SQL не должен делать «ORDER BY» user'.istance ». Это должно быть просто «ORDER BY distance». Я просто попробовал его с рельсами 3.2.13, геокодер 1.1.8 и pg 0.15.0 (postgres version 9.1.1). Что-то еще добавляет имя таблицы, которое заворачивает вас, я думаю. –

ответ

1

Вам не нужно указывать order: :distance, результаты будут отсортированы по расстоянию по умолчанию.

-1

При использовании Postgres вместе с Geocoder gem ваши запросы не могут использовать в запросе символизированные ключи (в данном случае :distance). Использование строки «расстояние» в этом случае позволяет избежать проблемы.

@users = User.near(params[:search], 50, :order => 'distance') 
-1

попробовать это:

User.near(params[:search], 50).reorder("distance asc") 

Put orderding в кавычки, так что не смотрит на него, как столбец таблицы.

изменение порядка (..) переопределяет заказ.

Смежные вопросы