如何在ActiveRecord中跳过验证检查(甚至不进入验证检查)?

时间:2011-08-29 18:02:59

标签: ruby-on-rails ruby

我有一个模型,在使用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中跳过验证检查?

2 个答案:

答案 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