Rails GeoCoder,在现有数据库和geocode_by中循环:address,:city,:state



我导入了一个包含10000个位置的.csv文件,我需要通过几个字段而不是通常的"geocode_by:address"在数据库和地理代码中循环

我正在使用地理编码宝石。

我的数据库方案看起来像这个

    create_table "locations", :force => true do |t|
      t.string   "Address"
      t.string   "City"
      t.string   "State"
      t.string   "Zip"
      t.float    "latitude"
      t.float    "longitude"
      t.datetime "created_at"
      t.datetime "updated_at"
    end 

我可以在控制器操作中而不是在验证中执行此操作吗?我应该这样做吗:

 def index
    @locations = Location.all
    @locations.each do |l|
        new_address = "#{l.Address} #{l.City} #{l.State}"
        geocode_by = :new_address
    end
 end

但是,是的,我们非常感谢您的帮助,谢谢!

我能够用这个控制器代码来工作:

  def index
    if params[:search].present?
      @locations = Location.near(params[:search], 20, :order => :distance)
    else
      @locations = Location.all
      @locations.each do |l|
        if l.latitude.nil?
          new_location = "#{l.HP_Address_1} #{l.HP_City} #{l.HP_State}"
          s = Geocoder.search(new_location)
          l.latitude = s[0].latitude
          l.longitude = s[0].longitude
          l.save
        end
      end
    end
  end

它循环遍历数据库中的每个条目,如果纬度和经度值尚未编码,它会调用正确的地理编码函数,并将返回的纬度/经度值存储在数据库中。

我的数据库中有9k个条目,所以由于谷歌地图api的限制,我每天只能编码2k个条目。但对于那些习惯于在模型中使用geocoded_by对创建过程中的条目进行编码的人来说,这将在控制器中起作用。

这是我对工人(延迟工作或重新工作)会做的事情,因为这可能需要一些时间才能完成。但我不确定我是否理解这个问题,所以这可能不是你所期望的那种答案。

如果您想处理类中的每一条记录,就有一个rake任务。

rake地理编码:all CLASS=YourModel sleep=0.25

最新更新