微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过验证批量导入并使用 paper_trail 创建版本?

如何解决如何通过验证批量导入并使用 paper_trail 创建版本?

我有一个哈希数组(大约 20k),我需要导入但需要验证,并且还必须使用 paper_trail 创建版本。

arr = [{some_1_id: '1',some_2_id: '2',some_3_id: '3',amount: '123'},{some_1_id: '1',amount: '123'}]

我有一个这样的哈希数组。在这里,我们可以预期大约有 20k 个元素需要保存到 DB。

我使用了 activerecord-import,但它绕过了所有回调,包括 paper_trail 回调。

我尝试像这样运行回调

books.each do |book|
  book.run_callbacks(:save) { false }
  book.run_callbacks(:create) { false }
end
Book.import(books)

但它没有正确保存 paper_trail 版本。

我所做的是

arr.each do |a|
 valid_books = []
 book_obj = Book.new
 # validate some_1_id
 # validate some_2_id   
 # validate some_3_id
 # Some other validations
 if book_obj.valid?
   valid_books << book_obj
 end
end
 # Run call backs 
 Book.import valid_books

它按预期工作,但性能根本不好。 10k 条记录需要 30 多秒。

提前致谢。

解决方法

10k 条记录需要 30 多秒。

30s 处于正常验证和创建 10k 版本记录的预期性能范围内(即 newvalid?save 和 PT 回调)。在某些应用程序中,30 秒会被认为很快,尤其是当验证和其他回调执行自己的查询时。

我建议将导入过程放在 background job 中,并简单地要求用户等待。

如果导入已经在后台作业中,或者 bg.作业是不可能的,您可以探索使用 activerecord-import 两次:首先创建 30k Book 条记录,然后创建 30k PaperTrail::Version 条记录。这是一种高级技术,使用 PT 的私有(不受支持)API。要正确实例化 PaperTrail::Version 对象,请使用 PaperTrail::Events::Create,就像 PaperTrail::RecordTrail#build_version_on_create 一样。如果您成功使用此技术,我很乐意查看 PR,将其添加到我们的自述文件中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。