diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 4eee5874584118d5bf5685572defb3ac76851fe2..d03de3e565d66f6c6832e42e33648805f7a6bee6 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -1,6 +1,7 @@ require "geocoder/configuration" require "geocoder/calculations" require "geocoder/cache" +require "geocoder/model" require "geocoder/request" module Geocoder diff --git a/lib/geocoder/model.rb b/lib/geocoder/model.rb new file mode 100644 index 0000000000000000000000000000000000000000..d8dcbfeeb7f2f909657616ca22b444cbd75fdccc --- /dev/null +++ b/lib/geocoder/model.rb @@ -0,0 +1,75 @@ +require 'geocoder' + +module Geocoder + + ## + # Methods for invoking Geocoder in a model. + # + module Model + module Base + + ## + # Set attribute names and include the Geocoder module. + # + def geocoded_by(address_attr, options = {}, &block) + geocoder_init( + :geocode => true, + :user_address => address_attr, + :latitude => options[:latitude] || :latitude, + :longitude => options[:longitude] || :longitude, + :geocode_block => block + ) + end + + ## + # Set attribute names and include the Geocoder module. + # + def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block) + geocoder_init( + :reverse_geocode => true, + :fetched_address => options[:address] || :address, + :latitude => latitude_attr, + :longitude => longitude_attr, + :reverse_block => block + ) + end + + def geocoder_options + @geocoder_options + end + + private # ---------------------------------------------------------------- + + def geocoder_init(options) + unless geocoder_initialized? + @geocoder_options = {} + require "geocoder/orms/#{geocoder_file_name}" + include eval("Geocoder::Orm::" + geocoder_module_name) + end + @geocoder_options.merge! options + end + + def geocoder_initialized? + begin + included_modules.include? eval("Geocoder::Orm::" + geocoder_module_name) + rescue NameError + false + end + end + end + + module ActiveRecord + include Base + private + def geocoder_file_name; "active_record"; end + def geocoder_module_name; "ActiveRecord"; end + end + + module Mongoid + include Base + private + def geocoder_file_name; "mongoid"; end + def geocoder_module_name; "Mongoid"; end + end + end +end diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb index 4745c245db5d4c2108666ce86a1835f9b048c646..62cc25163ee27202a5c02c56a7bfac04626f44b3 100644 --- a/lib/geocoder/railtie.rb +++ b/lib/geocoder/railtie.rb @@ -1,4 +1,5 @@ require 'geocoder' +require 'geocoder/model' module Geocoder if defined? Rails::Railtie @@ -17,63 +18,8 @@ module Geocoder class Railtie def self.insert - return unless defined?(::ActiveRecord) - ::ActiveRecord::Base.extend(ModelMethods) - end - end - - ## - # Methods available in the model class before Geocoder is invoked. - # - module ModelMethods - - ## - # Set attribute names and include the Geocoder module. - # - def geocoded_by(address_attr, options = {}, &block) - geocoder_init( - :geocode => true, - :user_address => address_attr, - :latitude => options[:latitude] || :latitude, - :longitude => options[:longitude] || :longitude, - :geocode_block => block - ) - end - - ## - # Set attribute names and include the Geocoder module. - # - def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block) - geocoder_init( - :reverse_geocode => true, - :fetched_address => options[:address] || :address, - :latitude => latitude_attr, - :longitude => longitude_attr, - :reverse_block => block - ) - end - - def geocoder_options - @geocoder_options - end - - - private # ---------------------------------------------------------------- - - def geocoder_init(options) - unless geocoder_initialized? - @geocoder_options = {} - require 'geocoder/orms/active_record' - include Geocoder::Orm::ActiveRecord - end - @geocoder_options.merge! options - end - - def geocoder_initialized? - begin - included_modules.include? Geocoder::Orm::ActiveRecord - rescue NameError - false + if defined?(::ActiveRecord) + ::ActiveRecord::Base.extend(Model::ActiveRecord) end end end