Puis-je avoir reverse_geocoded_by et geocoded_by en même temps dans un modèle? Des rails

voix
0

Je cherche à permettre à mon modèle à géocodées par full_street_address et reverse_geocoded_by : latitude et : longitude afin que je puisse appeler Address.near et obtenir leur soit par l' une ou l'autre manière.

Cela semble fonctionner, mais cette approche pourrait causer problème potentiel ou est-il exact?

Voici mon 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
Créé 13/03/2018 à 18:51
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Il fonctionne , mais il est redondant. En effet , avec geocoded_byvous l'adresse complète et obtenir la latitude et la longitude, qui est votre cas. Mais reverse_geocoded_byvous permet d'obtenir une adresse d'une latitude et la longitude, mais vous l' avez déjà.

Il suffit de retirer le reverse_geocoded_byet si vous souhaitez utiliser la latitude et la longitude simplement appeler les champs de votre base de données: self.latitudeet self.longitude, par exemple, que vous devriez avoir défini (et le service de géocodage remplit pour vous).

Créé 13/03/2018 à 22:13
source utilisateur

voix
2

Oui, vous pouvez l'utiliser, par défaut, il remplacera si l'adresse et l'adresse donnant lat / lng.

Vous pouvez diviser en deux classes et appeler Address.near([:lat, :lng])trop tard , après sauver.

Des modèles

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

Manette

   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
Créé 14/03/2018 à 08:15
source utilisateur

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