diff --git a/lib/geocoder/calculations.rb b/lib/geocoder/calculations.rb index a01b89158..a3f1ff987 100644 --- a/lib/geocoder/calculations.rb +++ b/lib/geocoder/calculations.rb @@ -24,6 +24,18 @@ module Calculations # Not a number constant NAN = defined?(::Float::NAN) ? ::Float::NAN : 0 / 0.0 + ## + # Returns true if all given arguments are valid latitude/longitude values. + # + def coordinates_present?(*args) + args.each do |a| + # note that Float::NAN != Float::NAN + # still, this could probably be improved: + return false if (!a.is_a?(Numeric) or a.to_s == "NaN") + end + true + end + ## # Distance spanned by one degree of latitude in the given units. # diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index 0f710762f..782458f52 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -33,7 +33,7 @@ def self.included(base) # scope :near, lambda{ |location, *args| latitude, longitude = Geocoder::Calculations.extract_coordinates(location) - if latitude and longitude and ![latitude, longitude].include?(Geocoder::Calculations::NAN) + if Geocoder::Calculations.coordinates_present?(latitude, longitude) near_scope_options(latitude, longitude, *args) else where(false_condition) # no results if no lat/lon given @@ -68,7 +68,9 @@ module ClassMethods def distance_from_sql(location, *args) latitude, longitude = Geocoder::Calculations.extract_coordinates(location) - distance_from_sql_options(latitude, longitude, *args) if latitude and longitude + if Geocoder::Calculations.coordinates_present?(latitude, longitude) + distance_from_sql_options(latitude, longitude, *args) + end end private # ---------------------------------------------------------------- diff --git a/test/calculations_test.rb b/test/calculations_test.rb index c1be1d582..ee18f8361 100644 --- a/test/calculations_test.rb +++ b/test/calculations_test.rb @@ -178,5 +178,11 @@ def o.to_coordinates assert_in_delta 1.0 / 3, result.first, 1E-5 assert_in_delta 2.0 / 3, result.last, 1E-5 end -end + def test_coordinates_present + assert Geocoder::Calculations.coordinates_present?(3.23) + assert !Geocoder::Calculations.coordinates_present?(nil) + assert !Geocoder::Calculations.coordinates_present?(Geocoder::Calculations::NAN) + assert !Geocoder::Calculations.coordinates_present?(3.23, nil) + end +end