2009-07-17 3 views
2

Meine Address Klasse hat eine geocode Klassenmethode, die ein Array von Adressobjekten aus Geokodierung der Methode Parameter (wenn die Geocodierung ergibt eine genaue Übereinstimmung, das Array wird ein Element) zurückgegeben.Machen Sie GeoKit gut mit meiner Address-Klasse

Ein lästiger Teil beim Schreiben dieser Methode ist das Übersetzen der GeoKit-Adressobjekte in meine Adressobjekte (z. B. "street_address" -> "address1"). Gibt es einen besseren Weg, dies zu tun?

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 

Antwort

5

Was ist mit den folgenden

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

ich vergessen hatte, dass 'Address.new' einen Block nehmen. Sehr schön! –