Могу ли я иметь reverse_geocoded_by и geocoded_by в то же время в модели? Рельсы

голоса
0

Я ищу , чтобы моя модель , которая будет привязана к местности по full_street_address и reverse_geocoded_by : широта и долгота , так что я могу назвать Address.near и получить их либо одним или другим способом.

Это похоже на работу, но может этот подход вызывает потенциальную проблему, или это правильно?

Вот мой код:

class Address < ApplicationRecord
  geocoded_by :full_street_address
  after_validation :geocode
  reverse_geocoded_by :latitude, :longitude

  def full_street_address
    self.street + self.city + self.country
  end
end
Задан 13/03/2018 в 18:51
источник пользователем
На других языках...                            


2 ответов

голоса
1

Это работает , но это излишнее. Это потому , что с geocoded_byвас есть полный адрес улицы и получить широту и долготу, что ваш случай. Но reverse_geocoded_byпозволяет получить адрес от широты и долготы, но у вас уже есть.

Просто удалите , reverse_geocoded_byи если вы хотите использовать широту и долготу просто вызовите поля в базе данных: self.latitudeи self.longitude, к примеру, которые вы должны иметь определенные (и службу геокодирования заполняющие для вас).

Ответил 13/03/2018 в 22:13
источник пользователем

голоса
2

Да, вы можете использовать его, по умолчанию он будет перезаписывать Передавая адрес и LAT / LNG адрес.

Вы можете разделить на два класса и вызвать Address.near([:lat, :lng])слишком поздно после сохранения.

модели

- /model/address.rb
   class Address < ApplicationRecord
      #any association/validations here

      geocoded_by :full_street_address

      #by default it will save full address to address field. 
      reverse_geocoded_by :latitude, :longitude do |obj,results|
        if geo = results.first
            #customize as you want
              obj.street  = geo.address.split(',')[0]
              obj.city    = geo.city
              obj.zip     = geo.postal_code
              obj.state   = geo.state
        end
      end

      def full_street_address
         self.street + self.city + self.country
      end
   end

- /model/address/with_address.rb
   class Address::WithAddress < Address
      after_validation :geocode
   end

- /model/address/with_lat_lng.rb
   class Address::WithLatLng < Address
     after_validation :reverse_geocode
   end

контроллер

   address = Address::WithLatLng.create(latitude: 40.5236803, longitude: -80.2249546)
   # returns: will save lat/lng and address/city/state/zip fields saved from api
   address.full_street_address
   #or
   address = Address::WithAddress.create(address: "601 fake st.", city: "brooklyn", state: "ny", zip: "11220")
   # returns: will save address and latitude:, longitude: will fetch from api.
   address.full_street_address
Ответил 14/03/2018 в 08:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more