2013-08-27 27 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

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