Posso avere reverse_geocoded_by e geocoded_by allo stesso tempo in un modello? Rails

voti
0

Sto cercando di permettere che il mio modello da geocodificare da full_street_address e reverse_geocoded_by : latitudine e : la longitudine in modo che io possa chiamare Address.near e farli sia per l'uno o l'altro modo.

Questo sembra funzionare, ma potrebbe causare questo approccio potenziale problema o è corretta?

Ecco il mio codice:

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
È pubblicato 13/03/2018 alle 18:51
fonte dall'utente
In altre lingue...                            


2 risposte

voti
1

Funziona ma è ridondante. Questo perché con geocoded_byavete l'indirizzo completo strada e ottenere la latitudine e la longitudine, che è il vostro caso. Ma reverse_geocoded_byconsente di ottenere un indirizzo da un latitudine e longitudine, ma è già in possesso.

Basta togliere la reverse_geocoded_bye se si desidera utilizzare la latitudine e la longitudine è sufficiente chiamare i campi nel database: self.latitudee self.longitude, per esempio, che si dovrebbe avere definiti (e il servizio di geocodifica sta riempiendo per voi).

Risposto il 13/03/2018 a 22:13
fonte dall'utente

voti
2

Sì, Si può usare, per impostazione predefinita verranno sovrascritti se dare indirizzi e LAT / indirizzi.

È possibile dividere in due classi e chiamare Address.near([:lat, :lng])troppo tardi, dopo salvare.

Modelli

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

controllore

   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
Risposto il 14/03/2018 a 08:15
fonte dall'utente

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