对模型进行地理编码
假设你的用户和/或群组有个人资料,并且你希望在 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
地理编码地址的一种很好的方法,即提供 longitude
和 latitude
是地理编码器的宝石 。
添加地理编码器到 Gemfile
并运行 bundle
进行安装。
# Gemfile
gem 'geocoder', '~> 1.3'
为 latitude
和 longitude
添加数据库列,以便在数据库中保存位置。这比每次需要位置时查询地理编码服务更有效。它更快,你没有那么快达到查询限制。
➜ 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 。