diff --git a/lib/geocoder.rb b/lib/geocoder.rb index d03de3e565d66f6c6832e42e33648805f7a6bee6..9e1f157552313149fc08c6f3725866253c19255e 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -1,8 +1,9 @@ require "geocoder/configuration" require "geocoder/calculations" require "geocoder/cache" -require "geocoder/model" require "geocoder/request" +require "geocoder/models/active_record" +require "geocoder/models/mongoid" module Geocoder extend self diff --git a/lib/geocoder/model.rb b/lib/geocoder/model.rb deleted file mode 100644 index 752ee8213c3bd7d2abd30f4ed9ab99359064b15f..0000000000000000000000000000000000000000 --- a/lib/geocoder/model.rb +++ /dev/null @@ -1,110 +0,0 @@ -require 'geocoder' - -module Geocoder - - ## - # Methods for invoking Geocoder in a model. - # - module Model - module Base - - 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 - - ## - # 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 - - private - def geocoder_file_name; "active_record"; end - def geocoder_module_name; "ActiveRecord"; end - end - - module Mongoid - include Base - - ## - # Set attribute names and include the Geocoder module. - # - def geocoded_by(address_attr, options = {}, &block) - geocoder_init( - :geocode => true, - :user_address => address_attr, - :coordinates => options[:coordinates] || :coordinates, - :geocode_block => block - ) - end - - ## - # Set attribute names and include the Geocoder module. - # - def reverse_geocoded_by(coordinates_attr, options = {}, &block) - geocoder_init( - :reverse_geocode => true, - :fetched_address => options[:address] || :address, - :coordinates => coordinates_attr, - :reverse_block => block - ) - end - - def self.included(base); base.extend(self); end - private - def geocoder_file_name; "mongoid"; end - def geocoder_module_name; "Mongoid"; end - - def geocoder_init(options) - super(options) - - # create 2d index - index [[ geocoder_options[:coordinates], Mongo::GEO2D ]], - :min => -180, :max => 180 - end - end - end -end diff --git a/lib/geocoder/models/active_record.rb b/lib/geocoder/models/active_record.rb new file mode 100644 index 0000000000000000000000000000000000000000..67a17106accb7e66632091aac450bed5ceb2f699 --- /dev/null +++ b/lib/geocoder/models/active_record.rb @@ -0,0 +1,41 @@ +require 'geocoder/models/base' + +module Geocoder + module Model + module ActiveRecord + include 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 + + + private # -------------------------------------------------------------- + + def geocoder_file_name; "active_record"; end + def geocoder_module_name; "ActiveRecord"; end + end + end +end diff --git a/lib/geocoder/models/base.rb b/lib/geocoder/models/base.rb new file mode 100644 index 0000000000000000000000000000000000000000..aeaf4d9def4002775061bcd2a9d02c5fb17aeb2f --- /dev/null +++ b/lib/geocoder/models/base.rb @@ -0,0 +1,44 @@ +require 'geocoder' + +module Geocoder + + ## + # Methods for invoking Geocoder in a model. + # + module Model + module Base + + def geocoder_options + @geocoder_options + end + + def geocoded_by + fail + end + + def reverse_geocoded_by + fail + 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 + end +end diff --git a/lib/geocoder/models/mongoid.rb b/lib/geocoder/models/mongoid.rb new file mode 100644 index 0000000000000000000000000000000000000000..a3d2b1ffd6dbba6b65862da0febb64bcad40671a --- /dev/null +++ b/lib/geocoder/models/mongoid.rb @@ -0,0 +1,47 @@ +require 'geocoder/models/base' + +module Geocoder + module Model + module Mongoid + include Base + + def self.included(base); base.extend(self); end + + ## + # Set attribute names and include the Geocoder module. + # + def geocoded_by(address_attr, options = {}, &block) + geocoder_init( + :geocode => true, + :user_address => address_attr, + :coordinates => options[:coordinates] || :coordinates, + :geocode_block => block + ) + end + + ## + # Set attribute names and include the Geocoder module. + # + def reverse_geocoded_by(coordinates_attr, options = {}, &block) + geocoder_init( + :reverse_geocode => true, + :fetched_address => options[:address] || :address, + :coordinates => coordinates_attr, + :reverse_block => block + ) + end + + + private # -------------------------------------------------------------- + + def geocoder_file_name; "mongoid"; end + def geocoder_module_name; "Mongoid"; end + + def geocoder_init(options) + super(options) + index [[ geocoder_options[:coordinates], Mongo::GEO2D ]], + :min => -180, :max => 180 # create 2d index + end + end + end +end diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb index 62cc25163ee27202a5c02c56a7bfac04626f44b3..e39eb9d95755635d41da0f579475d0d9bad3c746 100644 --- a/lib/geocoder/railtie.rb +++ b/lib/geocoder/railtie.rb @@ -1,5 +1,5 @@ require 'geocoder' -require 'geocoder/model' +require 'geocoder/models/active_record' module Geocoder if defined? Rails::Railtie