【问题标题】: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 中的所有记录都经过验证,而那些无关紧要的记录(记录它们以了解错误)