【发布时间】:2015-08-12 13:40:04
【问题描述】:
在 Rails 4 应用中,用户可以从电子表格中导入数据。这些方法大致基于此Railscast
save 函数检查导入记录是否有效,如果不是则显示错误,如果所有记录都有效则保存。
def save
if imported_records.map(&:valid?).all?
imported_records.each do |record|
record.save!
end
true
else
imported_records.each_with_index do |record, index|
record.errors.full_messages.each do |message|
errors.add :base, "Row #{index+2}: #{message}"
end
end
false
end
end
如果电子表格仅包含几条记录,则此方法可以正常工作。
但在较大的电子表格中,该过程超过了应用的机架超时限制Request ran for longer than 30000ms(设置为反映 Heroku 限制)。
超时发生在record.save,可能是因为模型在保存时执行了一些回调和计算。
处理此问题的最佳方法是什么?
- 如果导入的记录无效,用户需要看到错误消息,所以 我不想将整个导入过程移到后台。
- 我无法将
record.save!方法移动到后台进程中,因为 Sidekiq 反对传递一个未保存的对象 -Unable to create a Global ID for Record without a model id.
是否有一种简单的方法可以批量遍历这些记录保存以避免长时间运行的过程?
【问题讨论】:
标签: ruby-on-rails