¿Puedo tener reverse_geocoded_by y geocoded_by al mismo tiempo en un modelo? raíles

votos
0

Busco para permitir que mi modelo a geocodifique por full_street_address y reverse_geocoded_by : latitud y : longitud de modo que pueda llamar Address.near y conseguir que sea por una u otra manera.

Esto parece funcionar, pero podría causar este enfoque problema potencial o ¿es correcto?

Aquí está mi código:

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
Publicado el 13/03/2018 a las 15:51
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Funciona pero es redundante. Esto se debe a geocoded_byque tiene la dirección completa de la calle y obtener la latitud y la longitud, la cual es su caso. Pero reverse_geocoded_byle permite obtener una dirección de una latitud y longitud, pero ya lo tienes.

Basta con retirar el reverse_geocoded_byy si desea utilizar la latitud y longitud simplemente llaman los campos en la base de datos: self.latitudey self.longitude, por ejemplo, que usted debe haber definido (y el servicio de geocodificación está llenando para usted).

Respondida el 13/03/2018 a las 19:13
fuente por usuario

votos
2

Sí, Se puede utilizar, por defecto se sobrescribe Si dar dirección y LAT / LNG direcciones.

Se puede dividir en dos clases y llamar Address.near([:lat, :lng])demasiado tarde después de guardar.

modelos

- /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

Controlador

   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
Respondida el 14/03/2018 a las 05:15
fuente por usuario

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