2010-12-14 15 views
1

Est-il possible de grouper par distance en utilisant la gemme geokit-rails pour ActiveRecord? Dites que j'ai 10.000 utilisateurs et je veux savoir combien sont 1 mile, 2 miles ... 100 miles d'un point. Comment puis-je faire cela en aussi peu de requêtes que possible?Group par distance dans Rails/SQL?

Faire quelque chose comme ça tue la performance évidemment:

(1..100).map { |i| User.count(:within => i, :origin => location) } 

est-il someway faire:

User.count(:within => 100, :origin => location, :group => "distance/100") # some sort of math perhaps 

Tout point dans la bonne direction serait génial! Une sorte de façon de regrouper les enregistrements dans un appel db par une gamme.

Répondre

0

Je pense que l'appel db suivant fera ce que vous demandez:

result = User.all(:select => "ROUND(distance/100) AS distance, COUNT(*) AS user_count", 
        :group => "ROUND(id/100)") 

Étant donné que ce ne se charge pas une instance d'utilisateur réel, vous devez spécifier dans la sélection les données que vous souhaitez accéder. Ensuite, vous pouvez parcourir le résultat comme ceci:

<% result.each do |group| %> 
    <p>Distance: <%= group.distance %>, Number of users: <%= group.user_count %></p> 
<% end %>