保存大量记录时如何避免超时?

时间:2015-08-12 05:13:44

标签: ruby-on-rails

在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.

是否有一种简单的方法可以批量迭代这些记录保存以避免长时间运行的过程?

1 个答案:

答案 0 :(得分:0)

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