Obtient les objets dans la plage spécifiée à partir d'un certain point et trie les objets par ordre de proximité.
Utilisez les geokit-rails comme un joyau lié aux informations de localisation. Je pense qu'il existe divers autres joyaux, mais je vais l'utiliser pour des raisons personnelles. La configuration est écrite sur github, elle est donc omise. https://github.com/geokit/geokit-rails
Le modèle après la configuration ressemble à ceci.
user.rb
class User < ApplicationRecord
acts_as_mappable default_units: :kms, default_formula: :sphere
end
Tout d'abord, obtenez un objet qui existe dans un rayon de n kilomètres à partir d'un certain point. Ici, la tour de Tokyo est représentée par la latitude et la longitude, et 5 km sont spécifiés à partir de là.
users_controller.rb
def index
users = User.within(5, origin: [35.658694, 139.745390])
end
Cela calculera la distance des colonnes lat, lng (par défaut) et récupérera l'objet.
Dans 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')
Parce que c'est écrit, quand je l'essaye
$ rails c --sandbox
> users = User.within(5, origin: [35.658694, 139.745390]).order('distance DESC, nbr_seats ASC')
J'ai eu l'erreur suivante.
ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'distance' in 'order clause')
En regardant le problème, il semble que le champ de distance a été supprimé. https://github.com/geokit/geokit-rails/issues/39 https://github.com/geokit/geokit-rails/issues/56 Cependant, comme ce sont des informations anciennes, je suis désolé si elles sont différentes maintenant.
Dans 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.
Je vous serais reconnaissant de bien vouloir me dire si c'est différent.
Cependant, je ne pouvais pas le faire dans mon environnement, alors je vais continuer en disant que je ne peux pas.
Tout d'abord, il est nécessaire de tenir la distance de l'emplacement spécifié (ici, la tour de Tokyo) comme état pour chacun des objets extraits, mais comme je pensais qu'il n'était pas nécessaire de le tenir dans la colonne, j'ai modélisé l'attribut virtuel (?) Je te le donnerai. Ici, c'est la distance.
user.rb
attr_accessor :distance
#réduction
Ensuite, nous devons trouver la distance pour le mettre: distance. Ceci peut être réalisé avec la méthode geokit-rails distance_from.
$ rails c --sandbox
> user = User.first
> user.distance_from([35.658694, 139.745390])
>La valeur de retour est la distance à cet utilisateur.
Définissez une méthode d'instance pour mettre temporairement cette distance obtenue en: distance.
user.rb
def get_distance(lat, lng)
self.distance = distance_from([lat, lng])
end
#réduction
Chaque objet peut maintenant maintenir sa distance par rapport au point spécifié. Ajoutez chaque syntaxe au contrôleur.
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
Cependant, cela n'a pas encore été réglé. Ceci est fait en utilisant la méthode sort_by de 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
Vous avez maintenant sorted_users avec un tableau d'objets triés par ordre croissant en fonction de: distance.