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