hoy estaba implementando algunas nuevas funcionalidades de b煤squeda y realmente necesitaba la funcionalidad 'geoNear' de mongo
http://docs.mongodb.org/manual/reference/command/geoNear/
desafortunadamente, la gema mongoid (3) no la soporta directamente.
afortunadamente, el c贸digo de durran (https://twitter.com/modetojoy) es tan bueno que unos momentos de investigaci贸n encontraron la soluci贸n, lo que llev贸 a este c贸digo real:
# http://stackoverflow.com/questions/5319988/how-is-maxdistance-measured-in-mongodb
# 1掳 latitud = 69.047 millas = 111.12 kil贸metros
#
GRADOS_POR_MILLA = 1 / 69.047
MILLAS_POR_GRADO = 1 / GRADOS_POR_MILLA
def Tienda.buscar_todos_por_lat_lng(lat, lng, opciones = {})
opciones.to_options!
millas = opciones[:millas] || 100
distancia_maxima = millas * GRADOS_POR_MILLA
doc =
Mongoid.sesion(:predeterminado).
comando(
:geoNear => Tienda.nombre_coleccion,
:cerca => {:lat => lat, :lng => lng},
:maxDistance => distancia_maxima
)
tiendas = []
if doc['ok'] == 1.0
resultados = Array(doc['resultados'])
resultados.each do |resultado|
distancia_en_grados = resultado['dis']
obj = resultado['obj']
tienda = Tienda.instanciar(obj)
tienda['distancia'] = Float(distancia_en_grados) * MILLAS_POR_GRADO
tiendas.push(tienda)
end
end
tiendas
end