2013-07-02 4 views
8

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): 
+0

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. –

+0

Ich aktualisierte das OP mit dem SQL. danke für Ihre Hilfe. – Leahcim

+0

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. –

Antwort

1

Sie müssen order: :distance nicht angeben erzeugt wird, werden die Ergebnisse nach Entfernung standardmäßig bestellt werden.

-1

Wenn Sie Postgres zusammen mit der Geocoder gem verwenden, können Ihre Abfragen keine symbolisierten Schlüssel (in diesem Fall :distance) in der Abfrage verwenden. Die Verwendung der Zeichenfolge "distance" in diesem Fall vermeidet das Problem.

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

versuchen Sie dies:

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

Put orderding in Anführungszeichen, damit es nicht auf sie als Tabellenspalte sieht.

Reorder (..) definiert die Reihenfolge neu.

Verwandte Themen