Module: DataMapper::GeoKit::ActsAsMappable::ClassMethods

Defined in:
lib/dm-geokit/acts_as_mappable.rb

Overview

Class method to mix into active record.

Instance Method Summary collapse

Instance Method Details

#acts_as_mappable(options = {}) ⇒ Object

Class method to bring distance query support into ActiveRecord models. By default uses :miles for distance units and performs calculations based upon the Haversine (sphere) formula. These can be changed by setting GeoKit::default_units and GeoKit::default_formula. Also, by default, uses lat, lng, and distance for respective column names. All of these can be overridden using the :default_units, :default_formula, :lat_column_name, :lng_column_name, and :distance_column_name hash keys.

Can also use to auto-geocode a specific column on create. Syntax;

acts_as_mappable :auto_geocode=>true

By default, it tries to geocode the “address” field. Or, for more customized behavior:

acts_as_mappable :auto_geocode=>{:field=>:address,:error_message=>'bad address'}

In both cases, it creates a before_validation_on_create callback to geocode the given column. For anything more customized, we recommend you forgo the auto_geocode option and create your own AR callback to handle geocoding.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/dm-geokit/acts_as_mappable.rb', line 49

def acts_as_mappable(options = {})
  # Mix in the module, but ensure to do so just once.
  return if self.included_modules.include?(GeoKit::ActsAsMappable::InstanceMethods)
  send :include, GeoKit::ActsAsMappable::InstanceMethods
  # include the Mappable module.
  send :include, Mappable
  
  # Handle class variables.
  cattr_accessor :distance_column_name, :default_units, :default_formula, :lat_column_name, :lng_column_name, :qualified_lat_column_name, :qualified_lng_column_name
  self.distance_column_name = options[:distance_column_name]  || 'distance'
  self.default_units = options[:default_units] || GeoKit::default_units
  self.default_formula = options[:default_formula] || GeoKit::default_formula
  self.lat_column_name = options[:lat_column_name] || 'lat'
  self.lng_column_name = options[:lng_column_name] || 'lng'
  self.qualified_lat_column_name = "#{table_name}.#{lat_column_name}"
  self.qualified_lng_column_name = "#{table_name}.#{lng_column_name}"
  if options.include?(:auto_geocode) && options[:auto_geocode]
    # if the form auto_geocode=>true is used, let the defaults take over by suppling an empty hash
    options[:auto_geocode] = {} if options[:auto_geocode] == true 
    cattr_accessor :auto_geocode_field, :auto_geocode_error_message
    self.auto_geocode_field = options[:auto_geocode][:field] || 'address'
    self.auto_geocode_error_message = options[:auto_geocode][:error_message] || 'could not locate address'
    
    # set the actual callback here
    before_validation_on_create :auto_geocode_address        
  end
end