Правильный ответ - на сегодняшний день - это то, что вы не можете. Драйвер ruby пока не поддерживает mongo 1.3.3, поэтому этот тип запроса геолокации просто невозможен.
Вот один пример того, как можно обойти проблему в это время.
class Trip
include MongoMapper::Document
key :route, Array # example: [[45,-122], [45.5, -122.5], [45, -123]]
...
scope :passes_near, lambda {|coords| where(:id => {'$in' => Trip.near(coords)}) }
def self.near(coords, options = {})
options[:radius] ||= 60
case coords
when Array; coords
when String; coords = Geocoder.coordinates(coords)
end
trips = {}
Trip.all.each do |trip|
dist = trip.route.map{|point| Geocoder::Calculations::distance_between(point, coords)}.min
trips[trip.id] = dist
end
return trips.select {|k, v| v < options[:radius]}.keys
end
end
Чтобы найти все поездки в Сиэтл ([47.6062095, -122.3320708]), я просто набрал:
Trip.passes_near("Seattle, WA")
=> #<Plucky::Query _id: {"$in"=>[*lots of ids*}, transformer: #...>
Поскольку возвращается отважный объект, было бы просто объединить запросы.