Module: GeoSpatial::ClassMethods
- Defined in:
- lib/mongo_geo.rb
Instance Method Summary collapse
Instance Method Details
#geo_key(name, klass, *args) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/mongo_geo.rb', line 21 def geo_key(name, klass, *args) unless [Array, Hash].include?(klass) raise ArgumentError, "#{ klass } is not a valid type for a geo_key\nUse an Array or a Hash" end will_create_index = if args.last.is_a?(Hash) && args.last.has_key?(:create_index) !!args.last.delete(:create_index) end if @geo_key_name.nil? key name.to_sym, klass, *args ensure_index([[name, Mongo::GEO2D]]) if will_create_index @geo_key_name = name else error = "MongoDB is currently limited to only one geospatial index per collection.\n" error += "geo_key #{ name } was NOT added to #{ self.name }" raise RuntimeError, error end end |
#geo_key_name ⇒ Object
41 42 43 |
# File 'lib/mongo_geo.rb', line 41 def geo_key_name @geo_key_name end |
#near(location, params = {}) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/mongo_geo.rb', line 45 def near(location, params = {}) args = BSON::OrderedHash.new args[:geoNear] = self.collection.name args[:near] = location params.each_pair{ |key, value| args[key.to_sym] = value } raw = database.command(args) objects = raw['results'].collect{ |r| self.load(r['obj']) } objects.instance_variable_set(:@raw, raw) objects.each.with_index do |obj, index| obj.instance_variable_set(:@distance, raw['results'][index]['dis']) def obj.distance @distance end end def objects.average_distance @raw['stats']['avgDistance'] end objects end |