问题描述
如果我提供了一个有效的地址,Geocoder gem 会一直很好地工作。但如果地址无效,则无法进行地理编码。
如果按完整地址进行地理编码失败,我如何通过邮政编码进行地理编码?
geocoded_by :address
after_validation :geocode
def address
[street,city,province,country,postal_code].compact.join(",")
end
有什么想法吗?
谢谢
解决方法
不幸的是,它有点老套,但您必须覆盖 geocode
方法。这样的事情应该可以解决问题:
# Override Geocoder's `geocode` method
def geocode
# Initially just call the original method as intended.
super
# Check to see if geocoding failed.
if latitude.blank? && longitude.blank?
# Now manually set the `user_address` key to only `postal_code`,instead of the original value of `address`.
self.class.geocoder_options[:user_address] = postal_code
# Now call the original method again.
super
end
end
我可能会在 gem 上打开 PR - 你的问题很有趣。某种后备选项肯定会非常有用。 :-)
,我最终使用了不同的解决方案。不确定这是否是最好的处理方式,但是:
after_validation :geocode_address
def geocode_address
results = Geocoder.search(full_address)
if results.empty?
postal_code_search = Geocoder.search(postal_code)
if !postal_code_search.empty?
lat_long = postal_code_search.first.coordinates
end
else
lat_long = results.first.coordinates
end
if lat_long && !lat_long.empty?
self.latitude = lat_long[0]
self.longitude = lat_long[1]
end
end
,
我遇到了同样的问题。
软件 | 版本 |
---|---|
Ruby | v2.6.6 |
Rails | v5.2.5 |
地理编码器 | v1.6.4 |
我的方法是给 geocode_by
方法一个块,如文档部分 Custom Result Handling 中所述。
就我而言,我最终得到了以下代码。我的模型名称是 Job
。如果对 API 的请求返回空,我会发出另一个请求,只包含我想要的字段。
geocoded_by :full_address do |job,results|
if results.empty?
geo = Geocoder.search(job.city).first
if geo.present?
job.latitude = geo.latitude
job.longitude = geo.longitude
end
else
job.latitude = results.first.latitude
job.longitude = results.first.longitude
end
end
after_validation :geocode,if: ->(job) { job.will_save_change_to_address? || job.will_save_change_to_city? }