2010-08-12 20 views
4

J'utilise la gemme Geokit et plug-in avec des rails 3. Il semble qu'il y ait un problème connu avec eux, que l'on voit ici http://github.com/andre/geokit-rails/issues#issue/15Geokit et rails 3

Maintenant, j'ai essayé de suivre la solution fournie au bas. J'ai collé cette définition de fonction, à la fin du fichier, juste au-dessus de acts_as_mapable, et juste après la première fois qu'elle a été appelée, mais rien ne s'est produit à chaque fois.

Une idée de quoi d'autre peut-on faire?

Merci

Répondre

1

Pour ceux qui peinent encore à avoir Geokit, je me suis déplacé à l'aide mongodb ... qui a la recherche intégrée à distance n tous ...

0

Hey Amit, Je ne sais pas si vous ceci encore triés mais je vais vous dire ce que je faisais juste au cas où.

I fourchue source Geokit-rails de andre puis cloné localement et ajouté le code de this gist à la ligne 34 de lib/geokit-rails/acts-as-mappable.rb, juste après la ligne qui lit module ClassMethods # :nodoc:.

Ensuite, j'ai remis ces modifications à mon repo fourchu sur github et utilisé ma fourche pour installer la source comme un plugin à mes rails 3 app. Cela a semblé fonctionner immédiatement, mais assurez-vous que vous avez la ligne acts_as_mappable ajoutée au modèle que vous voulez faire des calculs de distance et assurez-vous que vous avez deux colonnes flottantes sur cette base de données nommées :lat et :lng.

+0

hey! oui cela a fonctionné, mais pour une raison quelconque, le plugin ne fonctionne pas avec les rails 3 nemore ... donc je viens de faire mon propre plugin;) – Amit

7

J'ai rencontré des problèmes similaires lors de la mise à niveau de mon application vers les rails 3. J'utilise toujours Geokit pour le géocodage mais les étendues d'enregistrement actif pour les requêtes de base de données basées sur la distance. C'est plutôt pratique, et vous obtenez tout le bien d'Active Record 3. Voici un exemple de mon modèle d'utilisateur:

scope :near, lambda{ |*args| 
        origin = *args.first[:origin] 
        if (origin).is_a?(Array) 
        origin_lat, origin_lng = origin 
        else 
        origin_lat, origin_lng = origin.lat, origin.lng 
        end 
        origin_lat, origin_lng = deg2rad(origin_lat), deg2rad(origin_lng) 
        within = *args.first[:within] 
        { 
        :conditions => %(
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) <= #{within} 
        ), 
        :select => %(users.*, 
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) AS distance 
        ) 
        } 
       } 

Voici un blog avec un peu plus de détails sur le sujet: http://stcorbett.com/code/distance-queries-with-rails-3-without-geokit/

+0

Stcorbett de blog utile. Obtenir distance de la DB est pratique, et les portées en chaîne sont agréables. Je vous préviens que le nouveau champ apparaîtra sur le modèle de l'utilisateur (dans ce cas) et vous pouvez nommer le champ pour indiquer que ce n'est pas un attribut permananent de l'utilisateur, mais la distance d'un autre utilisateur .. –

+0

Ahh, point intéressant. Je pourrais voir aller jusqu'à nommer le nouvel attribut en fonction de l'utilisateur pour lequel la requête calcule la distance. Par exemple: "distance_a_utilisateur _ # {origine.id}". Cela vous donne un cerceau supplémentaire pour sauter lorsque vous voulez utiliser les données de distance. Bon produit. – stcorbett

4

devrait résoudre tous les problèmes que vous aviez l'année dernière. Assurez-vous d'utiliser mysql ou postgres si vous faites des calculs de distance.

3

Après un problème d'installation de la gemme geokit-rails3 sur Rails 3.1, je suis passé au geocoder gem. Il a également un calcul de distance (assurez-vous de ne pas oublier le s dans @ your_model.nearby * s * (5)). Il y a aussi un Railscast.