如何解决如何通过验证批量导入并使用 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 版本记录的预期性能范围内(即 new
、valid?
、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 举报,一经查实,本站将立刻删除。