2009-07-17 9 views
2

Ma classe Address a une méthode de classe geocode qui retourne un tableau d'objets d'adresse dérivé du géocodage du paramètre de la méthode (si le géocodage résulte en une correspondance exacte, le tableau aura un élément). Une partie gênante à propos de l'écriture de cette méthode consiste à traduire les objets d'adresse GeoKit en mes objets d'adresse (par exemple, "street_address" -> "address1"). Y a-t-il une meilleure manière de faire cela?Faire bien fonctionner GeoKit avec ma classe d'adresse

class Address < ActiveRecord::Base 
    def self.geocode(string) 
    return nil if string.nil? 

    results = Geokit::Geocoders::GoogleGeocoder.geocode(string) 

    address_objects = Array.new 

    results.all.each do |r| 
     params = Hash.new 

     params['address1'] = r.street_address 
     params['city'] = r.city 
     params['zipcode'] = r.zip 
     params['state'] = State.find_by_abbr(r.state) 
     params['country'] = Country.find_by_iso(r.country_code) 

     new_address = Address.new(params) 
     new_address.single_line_address = r.full_address 

     address_objects << new_address  
    end 

    return address_objects 
    end 
end 

Répondre

5

Qu'en est-ce qui suit

class Address < ActiveRecord::Base 
    def self.geocode(string) 
    return if string.nil? 

    results = Geokit::Geocoders::GoogleGeocoder.geocode(string) 
    results.all.map do |r| 
     Address.new do |address| 
     address.address1 = r.street_address 
     address.city  = r.city 
     address.zipcode = r.zip 
     address.state  = State.find_by_abbr(r.state) 
     address.country = Country.find_by_iso(r.country_code) 
     address.single_line_address = r.full_address 
     end 
    end 
    end 
end 
+1

J'avais oublié que 'Address.new' peut prendre un bloc. Très agréable! –