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