module ActsAsGeocodable::Model

Public Class Methods

included(base) click to toggle source
# File lib/acts_as_geocodable.rb, line 109
def self.included(base)
  base.extend(ClassMethods)
end

Public Instance Methods

distance_to(destination, options = {}) click to toggle source

Get the distance to the given destination. The destination can be an acts_as_geocodable model, a Geocode, or a string

myhome.distance_to "Chicago, IL"
myhome.distance_to "49423"
myhome.distance_to other_model

Options

  • :units: :miles or :kilometers

  • :formula: The formula to use to calculate the distance. This can be any formula supported by Graticule. The default is :haversine.

# File lib/acts_as_geocodable.rb, line 208
def distance_to(destination, options = {})
  units = options[:units] || acts_as_geocodable_options[:units]
  formula = options[:formula] || :haversine

  geocode = self.class.location_to_geocode(destination)
  self.geocode.distance_to(geocode, units, formula)
end
geocode() click to toggle source

Get the geocode for this model

# File lib/acts_as_geocodable.rb, line 183
def geocode
  geocoding.geocode if geocoding
end
to_location() click to toggle source

Create a Graticule::Location

# File lib/acts_as_geocodable.rb, line 188
def to_location
  Graticule::Location.new.tap do |location|
    [:street, :locality, :region, :postal_code, :country].each do |attr|
      location.send("#{attr}=", geo_attribute(attr))
    end
  end
end

Protected Instance Methods

attach_geocode() click to toggle source

Perform the geocoding

# File lib/acts_as_geocodable.rb, line 219
def attach_geocode
  new_geocode = Geocode.find_or_create_by_location(self.to_location) unless self.to_location.blank?
  if new_geocode && self.geocode != new_geocode
    run_callbacks :geocoding do
      self.geocoding = Geocoding.new(geocode: new_geocode)
      self.update_address self.acts_as_geocodable_options[:normalize_address]
    end
  elsif !new_geocode && self.geocoding
    self.geocoding.destroy
  end
  new_geocode
rescue Graticule::Error => error
  logger.warn error.message
end
geo_attribute(attr_key) click to toggle source
# File lib/acts_as_geocodable.rb, line 255
def geo_attribute(attr_key)
  if self.acts_as_geocodable_options[:address].is_a? Symbol
    attr_name = self.acts_as_geocodable_options[:address]
    attr_key == :street ? self.send(attr_name) : nil
  else
    attr_name = self.acts_as_geocodable_options[:address][attr_key]
    attr_name && self.respond_to?(attr_name) ? self.send(attr_name) : nil
  end
end
update_address(force = false) click to toggle source
# File lib/acts_as_geocodable.rb, line 234
def update_address(force = false)
  unless self.geocode.blank?
    if self.acts_as_geocodable_options[:address].is_a? Symbol
      method = self.acts_as_geocodable_options[:address]
      if self.respond_to?("#{method}=") && (self.send(method).blank? || force)
        self.send("#{method}=", self.geocode.to_location.to_s)
      end
    else
      self.acts_as_geocodable_options[:address].each do |attribute,method|
        if self.respond_to?("#{method}=") && (self.send(method).blank? || force)
          self.send("#{method}=", self.geocode.send(attribute))
        end
      end
    end

    self.class.without_callback(:save, :after, :attach_geocode) do
      save
    end
  end
end