ActiveRecord的。这是一个推荐的交易。如何确保保存所有记录

时间:2017-05-19 16:34:40

标签: ruby activerecord

我有以下内容。

files.each do |file_path|
   filename = file_path_to_file_name(file_path)
   feature = Feature.new
   feature.name = filename_to_name(filename)
   feature.filename = filename
   feature.suite_id = suite.id
   feature.save!
end

我想确保每个功能都得到保存,但如果抛出异常,我不想停止。我不想只是默默地失败并继续前进,这就是我将!save一起使用的原因。

首先:这是我应该使用交易的情况(如下所示)?:

found_tests.each do |file_path|
   Feature.transaction do
      filename = file_path_to_file_name(file_path)
      feature = Feature.new
      feature.name = filename_to_name(filename)
      feature.filename = filename
      feature.suite_id = suite.id
      feature.save!
   end
end

其次,有什么方法可以确保一切都得到保存?每当这个特定的脚本运行时,我经常处理少于10,000件保存的订单时会有什么风险。

1 个答案:

答案 0 :(得分:0)

  1. 如果您有验证,无论您使用save还是save!,数据都不会保留。当您进行多次更新时,通常会使用.transaction,并说最后一次更新失败,因此您还必须回滚以前的更新。你的情况不是这样的。
  2. 有多种方法可以确保您保存了所有内容。每次失败时,您都可以保留Redis队列或其他内容,这样您就可以调查某些功能未保存的原因,然后尝试修复然后再次保存。
  3. 如果您想继续运行脚本,则需要解除异常并致电next以转到下一个file_path

    found_tests.each do |file_path|
      begin
        filename = file_path_to_file_name(file_path)
        feature = Feature.new
        feature.name = filename_to_name(filename)
        feature.filename = filename
        feature.suite_id = suite.id
        feature.save!
      rescue YourError => e
        puts e
        next
      end
    end