2009-07-17 6 views
2

私のAddressクラスには、メソッドのパラメータをジオコーディングして派生したアドレスオブジェクトの配列を返すgeocodeクラスメソッドがあります(ジオコーディングの結果が完全一致した場合、配列には1つの要素があります)。住所クラスでGeoKitをきれいに再生する

このメソッドを記述する際の厄介な点の1つは、GeoKitのアドレスオブジェクトを自分のアドレスオブジェクトに変換することです(例: "street_address" - > "address1")。これを行うより良い方法はありますか?

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 

答えて

5

私は `Address.new`は、ブロックを取ることができることを忘れていた以下の

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

について。非常に素晴らしい! –

関連する問題