【问题标题】:Import - csv to activerecord - error handling in Rails导入 - csv 到 activerecord - Rails 中的错误处理
【发布时间】:2010-07-13 20:50:19
【问题描述】:

我正在编写一个导入例程,允许用户上传 CSV 文件以加载他们的数据库。 CSV 的每一行对应一个 model

我正在使用 FasterCSV 读取文件并将数据拆分为单独的模型,效果很好。我只是在决定处理错误的最佳方法时遇到了麻烦。

现在我正在这样做,但对我来说确实是错误的:

def import(collection)
  begin
    self.transaction do
      collection.collect{|object| object.save!}
    end
  rescue ActiveRecord::RecordInvalid => invalid
    return false
  end

  return true
end

有没有更好的方法来保存模型集合?

【问题讨论】:

    标签: ruby-on-rails csv activerecord error-handling


    【解决方案1】:

    当您想要追踪有问题的记录时,在循环中使用异常会给您带来各种麻烦。您可能会尝试将它们全部保存,但报告有错误的那些:

     def import(collection)
       failed = nil
    
       transaction do
         failed = collection.reject { |r| r.save }
    
         unless (failed.empty?)
           raise ActiveRecord::Rollback
         end
       end
    
       failed
     end
    

    这假设您有兴趣查看错误。如果任何记录失败,它们将在一个数组中返回。否则你会得到一个 nil,这意味着没有错误。

    如果你不在乎,你总是可以做一个快速而肮脏的保存:

    def import(collection)
      transaction do
        collection.each(&:save!)
      end
    end
    

    这将为第一次失败弹出一个 ActiveRecord::RecordInvalid 异常。

    【讨论】:

      【解决方案2】:

      对于这个问题,我认为更好的方法是你的。也许不是 csv 中的所有记录都经过验证,而那些无关紧要的记录(记录它们以了解错误)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多