Ruft Objekte innerhalb des angegebenen Bereichs ab einem bestimmten Punkt ab und sortiert die Objekte in der Reihenfolge ihrer Nähe.
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
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.
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