在Rails / SQL中按距离分组?

时间:2010-12-14 04:06:03

标签: sql ruby-on-rails

是否可以使用ActiveRecord的geokit-rails gem进行距离分组?

假设我有10,000个用户,我想知道有多少是1英里,2英里......距离一个点100英里。我怎样才能在尽可能少的查询中做到这一点?

做这样的事情显然会导致性能下降:

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

有什么可以做的:

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

正确方向的任何一点都会很棒!某种通过范围在一个db调用中对记录进行分块的方法。

1 个答案:

答案 0 :(得分:0)

我认为以下数据库调用可以满足您的要求:

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

由于这不会加载实际的用户实例,因此您必须在select中指定要访问的数据。然后你可以像这样循环结果:

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