diff --git a/lib/geocoder.rb b/lib/geocoder.rb index e043def76fc881d57562bb311f7b8fe5e210b974..3e63f1b04997406c1fd2f6fa53c42ed791676656 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -106,13 +106,27 @@ module Geocoder def default_near_scope_options(latitude, longitude, radius, options) lat_attr = geocoder_options[:latitude] lon_attr = geocoder_options[:longitude] + conditions = \ + ["#{lat_attr} BETWEEN ? AND ? AND #{lon_attr} BETWEEN ? AND ?"] + + coordinate_bounds(latitude, longitude, radius) + + # Handle conditions. Passing of conditions by developers is deprecated + # but we will still need to handle conditions so, for example, we can + # exclude objects by ID from the nearbys method. This is incredibly + # ugly and doesn't work for a conditions hash: try using Arel? + if options[:conditions].is_a?(String) + options[:conditions] = [options[:conditions]] + end + if options[:conditions].is_a?(Array) + conditions[0] = "(#{conditions[0]}) AND #{options[:conditions][0]}" + conditions << options[:conditions][1] + end + { :order => options[:order], :limit => options[:limit], :offset => options[:offset], - :conditions => \ - ["#{lat_attr} BETWEEN ? AND ? AND #{lon_attr} BETWEEN ? AND ?"] + - coordinate_bounds(latitude, longitude, radius) + :conditions => conditions } end @@ -164,9 +178,17 @@ module Geocoder # (<tt>:order</tt>, <tt>:limit</tt>, and <tt>:offset</tt>). # def nearbys(radius = 20, options = {}) + if options != {} + warn "DEPRECATION WARNING: The 'options' argument to the nearbys " + + "method is deprecated and will be removed from rails-geocoder in " + + "version 0.9.4. Nearbys now returns a scope so you should specify " + + "more scopes and/or conditions via chaining. For example: " + + "city.nearbys(20).order('name').limit(10). Support for Rails 2.x " + + "will be discontinued after rails-geocoder 0.9.3." + end return [] unless geocoded? - options = {:conditions => ["id != ?", id]}.merge(options) - self.class.near(read_coordinates, radius, options) - [self] + options.reverse_merge!(:conditions => ["id != ?", id]) + self.class.near(read_coordinates, radius, options) end ##