From 2c96be13f0e4e9bc39a27fe5deb7899b6636baf3 Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Mon, 11 Apr 2011 13:52:04 -0400 Subject: [PATCH] Fix Mongoid/Ruby 1.8 "can't find special index". Hash order needs to be preserved so with Ruby 1.8 we use a BSON::OrderedHash instead of a generic one. --- lib/geocoder/stores/mongoid.rb | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/geocoder/stores/mongoid.rb b/lib/geocoder/stores/mongoid.rb index 9d1eabe0..a4201540 100644 --- a/lib/geocoder/stores/mongoid.rb +++ b/lib/geocoder/stores/mongoid.rb @@ -19,11 +19,17 @@ module Geocoder::Store coords = Geocoder::Calculations.extract_coordinates(location) radius = args.size > 0 ? args.shift : 20 options = args.size > 0 ? args.shift : {} - conds = {:coordinates => { - "$nearSphere" => coords.reverse, - "$maxDistance" => Geocoder::Calculations.distance_to_radians( - radius, options[:units] || :mi) - }} + + # Use BSON::OrderedHash if Ruby's hashes are unordered. + # Conditions must be in order required by indexes (see mongo gem). + empty = RUBY_VERSION.split('.')[1].to_i < 9 ? BSON::OrderedHash.new : {} + + conds = empty.clone + conds[:coordinates] = empty.clone + conds[:coordinates]["$nearSphere"] = coords.reverse + conds[:coordinates]["$maxDistance"] = \ + Geocoder::Calculations.distance_to_radians(radius, options[:units] || :mi) + if obj = options[:exclude] conds[:_id.ne] = obj.id end -- GitLab