Kan jeg ha reverse_geocoded_by og geocoded_by samtidig i en modell? rails

stemmer
0

Jeg ønsker å gi min modell som skal geokodes av full_street_address og reverse_geocoded_by : breddegrad og : lengdegrad , slik at jeg kan ringe Address.near og få dem enten ved den ene eller den andre veien.

Dette ser ut til å fungere, men kan denne tilnærmingen føre til potensielt problem eller er det riktig?

Her er min kode:

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
Publisert på 13/03/2018 klokken 18:51
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Det fungerer, men det er overflødig. Det er fordi med geocoded_bydu har full gateadresse og få breddegrad og lengdegrad, noe som er tilfelle. Men reverse_geocoded_bylar deg hente en adresse fra en breddegrad og lengdegrad, men du allerede har det.

Bare fjerne reverse_geocoded_by, og hvis du ønsker å bruke breddegrad og lengdegrad kaller feltene i databasen: self.latitudeog self.longitude, for eksempel, som du bør ha definert (og geokoding tjenesten er å fylle ut for deg).

Svarte 13/03/2018 kl. 22:13
kilden bruker

stemmer
3

Ja, du kan bruke den som standard vil den overskrive hvis gi adresse og lat / lng-adresser.

Du kan dele inn i to klasser og ringe Address.near([:lat, :lng])for senere etter lagre.

modeller

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

Controller

   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
Svarte 14/03/2018 kl. 08:15
kilden bruker

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