2013-08-27 71 views
0

我已經從CSV文件導入了一堆位置,現在我需要讓它們進行地理編碼。當我手動創建新記錄時,我會在驗證後運行:geocode。我希望能夠立即在所有記錄上運行它。使用軌道控制檯中的方法更新所有記錄

我已經看過update_all,但一直未能得到它的工作。有沒有辦法做到這一點?

這裏是我的模型:

class Location < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 

    default_scope order('locations.name ASC') 

    acts_as_gmappable    

    attr_accessible    :name, 
           :address, 
           :city, 
           :province, 
           :postal_code, 
           :country, 
           :phone, 
           :ext, 
           :phone_alt, 
           :ext_alt, 
           :url, 
           :latitude, 
           :longitude 

    geocoded_by     :address 

    validates_presence_of   :name 
    validates_presence_of   :address 
    validates_presence_of   :city 
    validates_presence_of   :province 
    validates_presence_of   :postal_code 
    validates_presence_of   :country 


    after_validation    :geocode 


    def gmaps4rails_address 
    "#{self.address} #{self.city} #{self.province} #{self.postal_code} #{self.country}" 
    end       
end 

回答

3

update_all是在您的記錄執行數據庫更新語句,所以你可以Location.update_all("SET postal_code=null")清除了所有的郵政編碼字段。對於你的情況,這聽起來像你只是想在一批位置對象上運行你的方法。

如何:

Location.all.each do |loc| 
    loc.geocode 
end 
+0

這是一種工作,但我覺得,因爲它是在一個循環的API被踢了很多人的迴應。有沒有辦法在每個之間添加延遲? –

+0

你是什麼意思,踢他們回來?如果您只想減慢循環,則可以在每次地理編碼請求後添加一次睡眠(5次)。如果邏輯涉及更多 - 如果在發生故障時需要進行某種跟進,我會建議將其重構爲自定義rake任務:http://railscasts.com/episodes/66-custom-耙 - 任務 – pseudopeach

+0

是的,正是我所需要的,再次感謝! –