From 99a449f1696ba00756681f2efb525ce66e129f7f Mon Sep 17 00:00:00 2001
From: Alessio Fanelli <fana@alessiofanelli.com>
Date: Wed, 25 Nov 2015 20:31:05 +0100
Subject: [PATCH] Add batch reverse geocoding task

---
 lib/geocoder/stores/active_record.rb |  5 +++++
 lib/tasks/geocoder.rake              | 15 ++++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb
index 15e45ba1..771d5f89 100644
--- a/lib/geocoder/stores/active_record.rb
+++ b/lib/geocoder/stores/active_record.rb
@@ -28,6 +28,11 @@ module Geocoder::Store
             "OR #{table_name}.#{geocoder_options[:longitude]} IS NULL")
         }
 
+        # scope: not-reverse geocoded objects
+        scope :not_reverse_geocoded, lambda {
+          where("#{table_name}.#{geocoder_options[:fetched_address]} IS NULL")
+        }
+
         ##
         # Find all objects within a radius of the given location.
         # Location may be either a string to geocode or an array of
diff --git a/lib/tasks/geocoder.rake b/lib/tasks/geocoder.rake
index 2b6039af..febbf3fe 100644
--- a/lib/tasks/geocoder.rake
+++ b/lib/tasks/geocoder.rake
@@ -4,13 +4,22 @@ namespace :geocode do
     class_name = ENV['CLASS'] || ENV['class']
     sleep_timer = ENV['SLEEP'] || ENV['sleep']
     batch = ENV['BATCH'] || ENV['batch']
+    reverse = ENV['REVERSE'] || ENV['reverse']
     raise "Please specify a CLASS (model)" unless class_name
     klass = class_from_string(class_name)
     batch = batch.to_i unless batch.nil?
+    reverse = false unless reverse.to_s.downcase == 'true'
 
-    klass.not_geocoded.find_each(batch_size: batch) do |obj|
-      obj.geocode; obj.save
-      sleep(sleep_timer.to_f) unless sleep_timer.nil?
+    if reverse
+      klass.not_reverse_geocoded.find_each(batch_size: batch) do |obj|
+        obj.reverse_geocode; obj.save
+        sleep(sleep_timer.to_f) unless sleep_timer.nil?
+      end
+    else
+      klass.not_geocoded.find_each(batch_size: batch) do |obj|
+        obj.geocode; obj.save
+        sleep(sleep_timer.to_f) unless sleep_timer.nil?
+      end
     end
   end
 end
-- 
GitLab