Pot avea reverse_geocoded_by și geocoded_by în același timp, într-un model? Șine

voturi
0

Caut pentru a permite modelul meu să fie geocodificată de full_street_address și reverse_geocoded_by : latitudine și : longitudine , astfel încât să pot apela Address.near și să le fie de unul sau în celălalt sens.

Acest lucru pare să funcționeze, dar această abordare ar putea provoca potențială problemă sau este corect?

Iată codul meu:

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
Întrebat 13/03/2018 la 18:51
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

Acesta funcționează dar este redundantă. Asta deoarece cu geocoded_byai adresa completă de stradă și de a obține latitudinea și longitudinea, care este cazul. Dar reverse_geocoded_byvă permite să obțineți o adresă de la o latitudine și longitudine, dar aveți deja.

Doar îndepărtați reverse_geocoded_byși , dacă doriți să utilizați latitudinea și longitudinea pur și simplu apel câmpurile din baza de date: self.latitudeși self.longitude, de exemplu, care ar fi trebuit definit (și serviciul geocodificarea este de umplere pentru tine).

Publicat 13/03/2018 la 22:13
sursa de către utilizator

voturi
2

Da, puteți utiliza, în mod implicit va suprascrie dacă da adresa si lat / LNG adrese.

Puteți împărți în două clase și suna Address.near([:lat, :lng])prea târziu , după salvarea.

modele

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

Controlor

   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
Publicat 14/03/2018 la 08:15
sursa de către utilizator

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