Geocoder红宝石宝石需求?

时间:2014-04-11 12:20:43

标签: ruby-on-rails ruby google-maps geocoding

我有一个拥有超过400万个地址/记录的大型数据库。 当数据库是一个小的测试集时,rake命令(下面)工作正常,但现在使用大型数据库它只是停顿。

rake geocode:all CLASS=YourModel

2个问题: 1.是否有任何简单的方法可以在调用记录时(动态地)使地理编码器代码为null / nil lat和long。我觉得这很难。 2.其他人在对大型数据集进行地理编码和使用rake命令时遇到问题吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

更新

我根据此答案创建了拉取请求,现在您可以在geocoder中使用批处理:

rake geocode:all CLASS=YourModel SLEEP=0.25 BATCH=100

我会将此解决方案用于大型数据库,我从geocoder gem rake任务中获取它: 您可以根据自己的需要进行优化。 一些示例创建rake task

namespace :geocode_my_data do
  desc "Geocode all objects in my databse."
  task all: :environment do
  klass = User
    klass.where(geocoded: false).find_each(limit: 100) do |obj|
      obj.geocode; obj.save
    end
  end
end

$> rake geocode_my_data:all

答案 1 :(得分:0)

在代码下方使用,并将其作为geocode_my_data.rake放入我的lib / tasks文件夹中 要运行:

rake geocode:all CLASS=YourModel

效果很好!

namespace :geocode_my_data do
  desc "Geocode all objects without coordinates."
  task :all => :environment do
    class_name = ENV['CLASS'] || ENV['class']
    sleep_timer = ENV['SLEEP'] || ENV['sleep']
    raise "Please specify a CLASS (model)" unless class_name
    klass = class_from_string(class_name)

klass.not_geocoded.find_each(batch_size: 100) do |obj|
      obj.geocode; obj.save
      sleep(sleep_timer.to_f) unless sleep_timer.nil?
    end
  end
end

##
# Get a class object from the string given in the shell environment.
# Similar to ActiveSupport's +constantize+ method.
#
def class_from_string(class_name)
  parts = class_name.split("::")
  constant = Object
  parts.each do |part|
    constant = constant.const_get(part)
  end
  constant
end