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

什么语法允许两个同时搜索?

问题是geocoded_by 调用geocoder_init ,它只包含一组选项 ,因此geocoded_by geocoded_by :destination clobbers geocoded_by 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方法 ,看看gem是如何做到的,它处理的是什么样的错误。 不幸的是,我们不能使用do_lookup因为它依赖于配置的选项而不是接受参数。