diff --git a/README.md b/README.md index 1827dd5ad673e7a36719d0c336abbc5e6fb91837..297276aaf022b23e15f1a7d5d83ec50442ab5962 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,11 @@ Geocoder will print warnings if you exceed the rate limit for your geocoding ser rake geocode:all CLASS=YourModel sleep=0.25 +Batch processing.If your database is large, you can handle batches: + + rake geocode:all CLASS=YourModel sleep=0.25 batch=100 + + ### Avoiding Unnecessary API Requests Geocoding only needs to be performed under certain conditions. To avoid unnecessary work (and quota usage) you will probably want to geocode an object only when: diff --git a/lib/tasks/geocoder.rake b/lib/tasks/geocoder.rake index 9bb15c5b6522b93230d98f6cc28e7124f51e09ad..2b6039af365118f3cf668007b820c229f8b660a8 100644 --- a/lib/tasks/geocoder.rake +++ b/lib/tasks/geocoder.rake @@ -3,10 +3,12 @@ namespace :geocode do task :all => :environment do class_name = ENV['CLASS'] || ENV['class'] sleep_timer = ENV['SLEEP'] || ENV['sleep'] + batch = ENV['BATCH'] || ENV['batch'] raise "Please specify a CLASS (model)" unless class_name klass = class_from_string(class_name) + batch = batch.to_i unless batch.nil? - klass.not_geocoded.each do |obj| + klass.not_geocoded.find_each(batch_size: batch) do |obj| obj.geocode; obj.save sleep(sleep_timer.to_f) unless sleep_timer.nil? end diff --git a/test/unit/rake_task_test.rb b/test/unit/rake_task_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..ca832298c668f9b6f3f483c57efcdea8c949baeb --- /dev/null +++ b/test/unit/rake_task_test.rb @@ -0,0 +1,21 @@ +# encoding: utf-8 +$: << File.join(File.dirname(__FILE__), "..") +require 'test_helper' + +class RakeTaskTest < GeocoderTestCase + def setup + Rake.application.rake_require "tasks/geocoder" + Rake::Task.define_task(:environment) + end + + def test_rake_task_geocode_raise_specify_class_message + assert_raise(RuntimeError, "Please specify a CLASS (model)") do + Rake.application.invoke_task("geocode:all") + end + end + + def test_rake_task_geocode_specify_class + ENV['CLASS'] = 'Place' + assert_nil Rake.application.invoke_task("geocode:all") + end +end