对模型进行地理编码

假设你的用户和/或群组有个人资料,并且你希望在 Google 地图上显示地址个人资料字段。

# app/models/profile_fields/address.rb
class ProfileFields::Address < ProfileFields::Base
  # Attributes: 
  # label, e.g. "Work address"
  # value, e.g. "Willy-Brandt-Straße 1\n10557 Berlin"
end

地理编码地址的一种很好的方法,即提供 longitudelatitude地理编码器的宝石

添加地理编码器到 Gemfile 并运行 bundle 进行安装。

# Gemfile
gem 'geocoder', '~> 1.3'

latitudelongitude 添加数据库列,以便在数据库中保存位置。这比每次需要位置时查询地理编码服务更有效。它更快,你没有那么快达到查询限制。

➜ bin/rails generate migration add_latitude_and_longitude_to_profile_fields \
    latitude:float longitude:float
➜ bin/rails db:migrate  # Rails 5, or:
➜ rake db:migrate       # Rails 3, 4

将地理编码机制添加到模型中。在此示例中,地址字符串存储在 value 属性中。配置地理编码以在记录更改时执行,并且仅存在值:

# app/models/profile_fields/address.rb
class ProfileFields::Address < ProfileFields::Base
  geocoded_by :value
  after_validation :geocode, if: ->(address_field){ 
    address_field.value.present? and address_field.value_changed? 
  }

end

默认情况下,地理编码器使用谷歌作为查找服务。它有许多有趣的功能,如距离计算或邻近搜索。有关更多信息,请查看地理编码器 README