[RUBY] Obtenez des informations de localisation avec Rails et triez par ordre croissant

Chose que tu veux faire

Obtient les objets dans la plage spécifiée à partir d'un certain point et trie les objets par ordre de proximité.

Essayer

Rendre les rails geokit disponibles

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

Spécifiez la plage et récupérez l'objet

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.

Trier les objets récupérés par ordre de proximité

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.

Recommended Posts

Obtenez des informations de localisation avec Rails et triez par ordre croissant
Tri des données Décroissant, croissant / Rails
[Rails] Classement et pagination par J'aime
Obtenez rapidement des informations de localisation
Obtenir des informations de localisation Android
Comment trier par ordre croissant / décroissant avec SQLite
[Rails] Obtenir UserAgent sur le contrôleur
Obtenir des informations dans une instance et calculer des nombres Version standard
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Tri par ordre croissant en Java (Tri à bulles: algorithme de méthode d'échange simple)
Trier la liste par ordre décroissant en Java et générer une nouvelle liste de manière non destructive
Activer jQuery et Bootstrap dans Rails 6 (Rails 6)
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Supprimez les "actifs" et les "turbolinks" dans "Rails6".
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
[Rails] Utilisez le dispositif pour obtenir des informations sur l'utilisateur actuellement connecté
Faire un tri à bulles et sélectionner le tri avec Ruby
Obtenez les prévisions météo de Open Weather Map with Rails
Obtenez des informations vidéo YouTube avec Retrofit et conservez-les dans l'application Android.
Obtenez des informations contextuelles telles que HttpServletRequest dans Jersey
[Order method] Définit l'ordre des données dans Rails
Enregistreur de rails Obtenez une idée approximative en 1 minute
Bibliothèque "OSHI" pour acquérir des informations système avec Java
[Rails] Comment émettre des messages de réussite et d'erreur
[Rails] ActiveRecord :: HasManyThrough Order Error in Users # show