From 0f6ebfeac30b6538649e1e18f09faf061fc34451 Mon Sep 17 00:00:00 2001 From: brendandillon <br.lyle.dillon@gmail.com> Date: Wed, 18 Jan 2017 20:20:44 -0700 Subject: [PATCH] Use manual batching in rake task (#1140) Changes batching in the rake task to work using a loop instead of the find_each method which does not work with Mongoid. This should fix #1126. --- lib/tasks/geocoder.rake | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/tasks/geocoder.rake b/lib/tasks/geocoder.rake index 121e9910..b4d8c504 100644 --- a/lib/tasks/geocoder.rake +++ b/lib/tasks/geocoder.rake @@ -1,3 +1,5 @@ +require "geocoder/models/mongoid" + namespace :geocode do desc "Geocode all objects without coordinates." task :all => :environment do @@ -8,22 +10,28 @@ namespace :geocode do raise "Please specify a CLASS (model)" unless class_name klass = class_from_string(class_name) batch = (batch.to_i unless batch.nil?) || 1000 + orm = (klass < Geocoder::Model::Mongoid) ? 'mongoid' : 'active_record' reverse = false unless reverse.to_s.downcase == 'true' - 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? + geocode_record = lambda { |obj| + reverse ? obj.reverse_geocode : obj.geocode + obj.save + sleep(sleep_timer.to_f) unless sleep_timer.nil? + } + + scope = reverse ? klass.not_reverse_geocoded : klass.not_geocoded + if orm == 'mongoid' + scope.each do |obj| + geocode_record.call(obj) 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? + elsif orm == 'active_record' + scope.find_each(batch_size: batch) do |obj| + geocode_record.call(obj) end end + end end - ## # Get a class object from the string given in the shell environment. # Similar to ActiveSupport's +constantize+ method. -- GitLab