我有一个模型,在使用geokit-rails
插件保存模型之前计算地理编码。我必须运行一个Rake任务,其中state字段被数据库中的缩写替换。我打算使用状态及其映射缩写的哈希来完成此任务。在这样做时,我不想再次计算地理编码,因为每个记录需要时间。这是我的代码:
Site.all.each do |site|
site.state = Site.convert_to_abbr(site.state)
site.save(false)
end
Site
型号
US_STATES = {
"Alabama" => "AL",
"Alaska" => "AK",
..
..
}
before_save :generate_lat_lon
def generate_lat_lon
puts "Entered validation"
@address = "#{address1}, #{city}, #{state}"
@location = Geokit::Geocoders::MultiGeocoder.geocode(@address)
if @location.success
self.lat = @location.lat
self.lon = @location.lng
else
self.lat = nil
self.lon = nil
end
end
def self.convert_to_abbr(state_string)
US_STATES[state_string.to_s.strip.titlecase] ? US_STATES[state_string.to_s.strip.titlecase] : state_string
end
但上述代码的问题在于,save(false)
会跳过验证,但不会跳过验证检查。因此,在保存记录之前计算地理编码,这非常耗时。是否有一种方法可以在Rails中跳过验证检查?
答案 0 :(得分:1)
您可以添加attr_accessor :calculate_lat_long
,并在调用true
的任何内容之前将其设置为save
。
您的模型将具有:
before_save :generate_lat_lon, :if => :calculate_lat_lon
答案 1 :(得分:1)
您可以使用
site.send(:update_without_callbacks)
http://ackbar.rubyforge.org/classes/ActiveRecord/Base.html#M000082