Module: Geocoder::Store::ActiveRecord

Includes:
Base
Defined in:
lib/geocoder/stores/active_record.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

#bearing_from, #bearing_to, #distance_to, #geocoded?, #nearbys, #to_coordinates

Class Method Details

.included(base) ⇒ Object

Implementation of ‘included’ hook method.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/geocoder/stores/active_record.rb', line 14

def self.included(base)
  base.extend ClassMethods
  base.class_eval do

    # scope: geocoded objects
    scope :geocoded, lambda {
      {:conditions => "#{geocoder_options[:latitude]} IS NOT NULL " +
        "AND #{geocoder_options[:longitude]} IS NOT NULL"}}

    # scope: not-geocoded objects
    scope :not_geocoded, lambda {
      {:conditions => "#{geocoder_options[:latitude]} IS NULL " +
        "OR #{geocoder_options[:longitude]} IS NULL"}}

    ##
    # Find all objects within a radius of the given location.
    # Location may be either a string to geocode or an array of
    # coordinates (<tt>[lat,lon]</tt>). Also takes an options hash
    # (see Geocoder::Orm::ActiveRecord::ClassMethods.near_scope_options
    # for details).
    #
    scope :near, lambda{ |location, *args|
      latitude, longitude = Geocoder::Calculations.extract_coordinates(location)
      if Geocoder::Calculations.coordinates_present?(latitude, longitude)
        near_scope_options(latitude, longitude, *args)
      else
        # If no lat/lon given we don't want any results, but we still
        # need distance and bearing columns so you can add, for example:
        # .order("distance")
        select(select_clause(nil, "NULL", "NULL")).where(false_condition)
      end
    }

    ##
    # Find all objects within the area of a given bounding box.
    # Bounds must be an array of locations specifying the southwest
    # corner followed by the northeast corner of the box
    # (<tt>[[sw_lat, sw_lon], [ne_lat, ne_lon]]</tt>).
    #
    scope :within_bounding_box, lambda{ |bounds|
      sw_lat, sw_lng, ne_lat, ne_lng = bounds.flatten if bounds
      if sw_lat && sw_lng && ne_lat && ne_lng
        {:conditions => Geocoder::Sql.within_bounding_box(
          sw_lat, sw_lng, ne_lat, ne_lng,
          full_column_name(geocoder_options[:latitude]),
          full_column_name(geocoder_options[:longitude])
        )}
      else
        select(select_clause(nil, "NULL", "NULL")).where(false_condition)
      end
    }
  end
end

Instance Method Details

#geocodeObject Also known as: fetch_coordinates

Look up coordinates and assign to latitude and longitude attributes (or other as specified in geocoded_by). Returns coordinates (array).



207
208
209
210
211
212
213
214
215
216
217
# File 'lib/geocoder/stores/active_record.rb', line 207

def geocode
  do_lookup(false) do |o,rs|
    if r = rs.first
      unless r.latitude.nil? or r.longitude.nil?
        o.__send__  "#{self.class.geocoder_options[:latitude]}=",  r.latitude
        o.__send__  "#{self.class.geocoder_options[:longitude]}=", r.longitude
      end
      r.coordinates
    end
  end
end

#reverse_geocodeObject Also known as: fetch_address

Look up address and assign to address attribute (or other as specified in reverse_geocoded_by). Returns address (string).



225
226
227
228
229
230
231
232
233
234
# File 'lib/geocoder/stores/active_record.rb', line 225

def reverse_geocode
  do_lookup(true) do |o,rs|
    if r = rs.first
      unless r.address.nil?
        o.__send__ "#{self.class.geocoder_options[:fetched_address]}=", r.address
      end
      r.address
    end
  end
end