Ich verwende den Geocoder Edelstein für Ruby, die Ryan Bates in Episode 273 http://railscasts.com/episodes/273-geocoder?view=asciicast einführt. In dieser Episode verwendet er Folgendes, um Objekte innerhalb eines Radius von 50 km zu durchsuchen (obwohl er ein Standortmodell verwendet, in dem ich ein Benutzermodell verwende).Geocoder Entfernung Methode existiert nicht
@users = User.near(params[:search], 50, :order => :distance)
wenn ich diesen Code auf einem Rails-4-App mit Postgres laufen, heißt es
PG::Error: ERROR: column users.distance does not exist
In Ryans Demo-Anwendung (Code hier https://github.com/railscasts/273-geocoder/tree/master/siteseer-after) er nicht eine Entfernung Spalte auf seinem Standort Modell hat (wie ich es nicht auf meinem Benutzermodell habe), so nahm ich an, dass distance
etwas vom Geocoder Edelstein geliefert wurde. Betrachtet man jedoch die Dokumente für den Geocoder http://rdoc.info/github/alexreisner/geocoder/master/frames, gibt es keine distance
Methode, und alle anderen entfernungsähnlichen Methoden erzeugen den gleichen Fehler.
Weiß jemand, wie ich Ergebnisse in dieser Abfrage nach Entfernung bestellen würde?
aktualisiert Auf der Geocoder Homepage http://www.rubygeocoder.com/ es gibt dieses Beispiel für die Verwendung von distance
, aber wenn ich es versuchen, es sagt, dass es nicht für den Benutzer nicht vorhanden ist.
nearbys = Place.near("Omaha, NE", 50,
:order => "distance")
bearing = nearbys.first.bearing # => 46.12
Geocoder::Calculations.compass_point(
bearing) # => "NE"
aktualisieren
Dies ist die 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):
Was ist das SQL, das im Protokoll generiert wird, wenn Sie diese Abfrage ausführen? Das SQL sollte eine Spalte "Abstand" haben, die das Ergebnis einer Berechnung ist. Es ist keine Methode, aber Sie sollten in der Lage sein, danach zu sortieren. –
Ich aktualisierte das OP mit dem SQL. danke für Ihre Hilfe. – Leahcim
Irgendwo stimmt etwas nicht. Die SQL sollte nicht "ORDER BY 'users'distance" ausführen. Es sollte nur "ORDER BY Abstand" sein. Ich habe es gerade mit Rails 3.2.13, Geocoder 1.1.8 und Pg 0.15.0 (postgres Version 9.1.1) versucht. Etwas anderes fügt den Tabellennamen hinzu, der dich verwirrt, denke ich. –