【问题标题】:How to avoid timeouts when saving a large number of records? [duplicate]保存大量记录时如何避免超时? [复制]
【发布时间】: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


    【解决方案1】:

    我认为之前的帖子已经回答了同样的问题
    参考:-Prevent request timeout with long requests
    请参考帖子,我希望它有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2015-10-04
      • 2015-12-11
      相关资源
      最近更新 更多