Geocoder使用两个地址

时间:2015-12-27 16:10:56

标签: ruby-on-rails rails-geocoder

rails 4.1.3使用Geocoder gem的应用程序在模型上具有以下属性

  t.decimal :origin_lon, :precision => 15, :scale => 10
  t.decimal :origin_lat, :precision => 15, :scale => 10
  t.point :origin_lonlat, :srid => 3857
  t.decimal :destination_lon, :precision => 15, :scale => 10
  t.decimal :destination_lat, :precision => 15, :scale => 10
  t.point :destination_lonlat, :srid => 3857

模型用

定义
geocoded_by :origin, :latitude  => :origin_lat, :longitude => :origin_lon
geocoded_by :destination, :latitude  => :destination_lat, :longitude => :destination_lon

但是,如果我在控制台中运行:

Circuit.create(origin: 'avenue des Champs-Élysées, 90 Paris', destination: 'Place Mariejol, Antibes')

不要查阅,它是毕加索博物馆......
仅填充目标数据。如果反转geocoded_by指令的顺序并重新启动服务器,则正在填充原始数据。很明显,在这种语法下只能调用一次geocoded_by

两种同时搜索的语法是什么?

1 个答案:

答案 0 :(得分:4)

问题是geocoded_by calls geocoder_init,其中只包含one set of options,因此geocoded_by :destination clobbers geocoded_by :origin

def geocoder_init(options)
  unless defined?(@geocoder_options)
    @geocoder_options = {}
    require "geocoder/stores/#{geocoder_file_name}"
    include Geocoder::Store.const_get(geocoder_module_name)
  end
  @geocoder_options.merge! options
end

您可以编写自己的ActiveRecord挂钩来对两者进行地理编码:

class Circuit < ActiveRecord::Base
  before_save :geocode_endpoints

  private

  def geocode_endpoints
    if origin_changed?
      geocoded = Geocoder.search(origin).first
      if geocoded
        self.origin_lat = geocoded.latitude
        self.origin_lon = geocoded.longitude
      end
    end
    # Repeat for destination
  end
end

看看geocode method,了解宝石是如何做到的,它处理的是什么样的错误。不幸的是,我们无法使用do_lookup因为它依赖于配置的选项而不是接受参数。