[RUBY] Holen Sie sich Standortinformationen mit Rails und sortieren Sie in aufsteigender Reihenfolge

Was du machen willst

Ruft Objekte innerhalb des angegebenen Bereichs ab einem bestimmten Punkt ab und sortiert die Objekte in der Reihenfolge ihrer Nähe.

Versuchen

Geokit-Schienen zur Verfügung stellen

Verwenden Sie Geokit-Schienen als Juwel für Standortinformationen. Ich denke, es gibt verschiedene andere Edelsteine, aber ich werde dies aus persönlichen Gründen verwenden. Das Setup ist auf Github geschrieben und wird daher weggelassen. https://github.com/geokit/geokit-rails

Das Modell nach dem Setup sieht folgendermaßen aus.

user.rb


class User < ApplicationRecord
    acts_as_mappable default_units: :kms, default_formula: :sphere
end

Geben Sie den Bereich an und rufen Sie das Objekt ab

Holen Sie sich zunächst ein Objekt, das sich in einem Radius von n Kilometern von einem bestimmten Punkt befindet. Hier wird der Tokyo Tower durch Breiten- und Längengrade dargestellt, und von dort werden 5 km angegeben.

users_controller.rb


def index
    users = User.within(5, origin: [35.658694, 139.745390])
end

Dadurch wird der Abstand zu den Spalten lat, lng (standardmäßig) berechnet und das Objekt abgerufen.

Sortieren Sie die abgerufenen Objekte in der Reihenfolge ihrer Nähe

In der README

You can add order clauses in the chain as for any ActiveRecord query Location.within(5, :origin => @somewhere).order('nbr_seats ASC') You can even sort by distance (use the same name as specified in the model class) Location.within(5, :origin => @somewhere).order('distance DESC, nbr_seats ASC')

Weil es geschrieben steht, wenn ich es versuche

$ rails c --sandbox
> users = User.within(5, origin: [35.658694, 139.745390]).order('distance DESC, nbr_seats ASC')

Ich habe den folgenden Fehler erhalten.

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'distance' in 'order clause')

Betrachtet man das Problem, so scheint das Entfernungsfeld entfernt worden zu sein. https://github.com/geokit/geokit-rails/issues/39 https://github.com/geokit/geokit-rails/issues/56 Da es sich jedoch um alte Informationen handelt, tut es mir leid, wenn es jetzt anders ist.

In der README

The plug-in creates a calculated distance field on AR instances that have been retrieved through a Geokit location query. By default, these fields are known as "distance" but this can be changed through the :distance_field_name key.

Ich wäre Ihnen dankbar, wenn Sie mir sagen könnten, ob es anders ist.

Ich konnte es jedoch nicht in meiner Umgebung tun, daher werde ich sagen, dass ich es nicht kann.

Zunächst muss der Abstand zum angegebenen Ort (in diesem Fall Tokyo Tower) als Status für jedes der extrahierten Objekte angegeben werden. Da ich jedoch der Meinung war, dass dies nicht in der Spalte erforderlich ist, habe ich das virtuelle (?) Attribut modelliert. Ich werde es dir geben. Hier ist es Entfernung.

user.rb


attr_accessor :distance
#Kürzung

Als nächstes müssen wir die Entfernung finden, um sie einzugeben: Entfernung. Dies kann mit der Methode geokit-rail distanz_von erreicht werden.

$ rails c --sandbox
> user = User.first
> user.distance_from([35.658694, 139.745390])
>Der Rückgabewert ist die Entfernung zu diesem Benutzer.

Definieren Sie eine Instanzmethode, um diese erhaltene Entfernung vorübergehend in: distance zu setzen.

user.rb


def get_distance(lat, lng)
    self.distance = distance_from([lat, lng])
end
#Kürzung

Jedes Objekt kann jetzt seinen Abstand zum angegebenen Punkt beibehalten. Fügen Sie dem Controller jede Syntax hinzu.

users_controller.rb


def index
    users = User.within(5, origin: [35.658694, 139.745390])
    get_distance_users = users.each {|user| user.get_distance(35.658694, 139.745390)}
end

Dies wurde jedoch noch nicht sortiert. Dies geschieht mit der sort_by-Methode von Ruby.

users_controller.rb


def index
    users = User.within(5, origin: [35.658694, 139.745390])
    get_distance_users = users.each {|user| user.get_distance(35.658694, 139.745390)}
    sorted_users = get_distance_users.sort_by {|a| a.distance}
end

Sie haben jetzt sorted_users mit einem Array von Objekten, die in aufsteigender Reihenfolge sortiert sind nach: Entfernung.

Recommended Posts

Holen Sie sich Standortinformationen mit Rails und sortieren Sie in aufsteigender Reihenfolge
Daten sortieren Absteigend, aufsteigend / Schienen
[Rails] Rangfolge und Paginierung in der Reihenfolge der Likes
Erhalten Sie schnell Standortinformationen
Holen Sie sich Android-Standortinformationen
So sortieren Sie mit SQLite in aufsteigender / absteigender Reihenfolge
[Rails] Holen Sie sich UserAgent auf den Controller
Informationen in einer Instanz abrufen und Zahlen berechnen Standardversion
Abrufen von Fehlerinformationen mithilfe von DefaultErrorAttributes und ErrorAttributeOptions in Spring Boot 2.3
Sortieren in aufsteigender Reihenfolge in Java (Blasensortierung: Einfacher Austauschmethodenalgorithmus)
Sortieren Sie die Liste in absteigender Reihenfolge in Java und generieren Sie zerstörungsfrei eine neue Liste
Aktivieren Sie jQuery und Bootstrap in Rails 6 (Rails 6).
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Entfernen Sie "Assets" und "Turbolinks" in "Rails6".
[Rails] So erhalten Sie die aktuell mit devise angemeldeten Benutzerinformationen
[Rails] Verwenden Sie devise, um Informationen zum aktuell angemeldeten Benutzer abzurufen
Blasensortierung durchführen und mit Ruby sortieren auswählen
Holen Sie sich Wettervorhersage von Open Weather Map with Rails
Holen Sie sich Youtube-Videoinformationen mit Retrofit und behalten Sie sie in der Android-App.
Erhalten Sie Kontextinformationen wie HttpServletRequest in Jersey
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
Rails Logger Machen Sie sich in 1 Minute eine ungefähre Vorstellung
Bibliothek "OSHI" zum Erfassen von Systeminformationen mit Java
[Rails] So geben Sie Erfolgs- und Fehlermeldungen aus
[Rails] ActiveRecord :: HasManyThrough-Bestellfehler in Benutzer # show