【问题标题】:Geocoder ruby gem on demand?按需地理编码器红宝石宝石?
【发布时间】:2014-04-11 12:20:43
【问题描述】:
我有一个包含 4 多万个地址/记录的大型数据库。
当数据库是一个小型测试集时,rake 命令(如下)运行良好,但现在对于大型数据库它只是简单地停止。
rake geocode:all CLASS=YourModel
2 个问题:
1. 在调用记录时(即时),是否有任何简单的方法可以使地理编码器编码为空/零纬度和经度。我有一种感觉,这将很难。
2. 其他人在对大型数据集进行地理编码和使用 rake 命令时遇到问题?
谢谢!
【问题讨论】:
标签:
ruby-on-rails
ruby
google-maps
geocoding
【解决方案1】:
更新:
我根据这个答案创建了拉取请求,现在您可以在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
【解决方案2】:
使用下面的代码并将其作为 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