對模型進行地理編碼

假設你的使用者和/或群組有個人資料,並且你希望在 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