Kann ich reverse_geocoded_by und geocoded_by zugleich in einem Modell? Schienen

stimmen
0

Ich suche mein Modell zu ermöglichen , wird geocodiert von full_street_address und reverse_geocoded_by : Breitengrad und : Länge , so dass ich Address.near anrufen und sie kann entweder durch die eine oder andere Art und Weise bekommen.

Dies scheint zu funktionieren, aber könnte dieser Ansatz potenzielles Problem verursacht oder ist es richtig?

Hier ist mein Code:

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
Veröffentlicht am 13/03/2018 um 18:51
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Es funktioniert , aber es ist überflüssig. Das liegt daran , mit geocoded_byIhnen die vollständige Adresse haben und erhalten die geografische Breite und Länge, die der Fall ist. Aber reverse_geocoded_bykönnen Sie eine Adresse von einem Breitengrad und Längengrad erhalten, aber Sie haben es bereits.

Entfernen Sie einfach das , reverse_geocoded_byund wenn Sie die Felder in Ihrer Datenbank den Breiten- und Längen rufen Sie einfach verwenden möchten: self.latitudeund self.longitude, zum Beispiel, die Sie definiert haben sollte (und das Geocoding Service ist für Sie ausfüllen).

Beantwortet am 13/03/2018 um 22:13
quelle vom benutzer

stimmen
2

Ja, Sie können es als Standard verwenden, wird es, wenn geben Adresse und lat / lng-Adressen überschrieben.

Sie können in zwei Klassen aufgeteilt und rufen Address.near([:lat, :lng])auch später nach speichern.

Models

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

Regler

   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
Beantwortet am 14/03/2018 um 08:15
quelle vom benutzer

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