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_nameObject



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