【发布时间】:2012-05-02 00:03:54
【问题描述】:
简介
我的应用有多个表,有些有关联,有些没有关联。
有些表格需要容纳大约 100,000 个条目。
该应用在 Ruby 1.9 上使用 Rails 3.2,并托管在 Heroku 上。如果需要,我可以联系工作人员。
问题中的要求
应用程序的一个重要要求是允许用户将数据导出为 CSV - 对此的要求是允许用户过滤他们想要导出的数据,但我现在并不担心这一点,因为您从下面的数据中可以看出,我已经硬编码了要导出的数据,但这确实排除了创建一个 rake 任务来导出整个表。
此外,实现的方法必须考虑到允许被多个表使用,以避免不必要的代码重复。
当前解决方案
我正在我的应用程序中实现延迟作业并在作业中执行 CSV 生成。在执行此操作时,我正在关注来自“abdullah”的http://www.ayokasystems.com/blog/delegating-long-running-jobs-in-rails/ 的解决方案。
我们的想法是生成 CSV 格式的数据并将其保存在 UserJobs 表的 LONGTEXT 字段中,以便用户在完成后和以后下载。
问题
上述教程中使用的方法在我的应用程序中运行良好,直到我一次运行 100,000 条记录的作业。为了克服这个问题,我尝试将很酷的 find_each 函数添加到 perform 方法中,但是延迟的作业工作者每次尝试处理它时都会报告一个错误:
[Worker(host:*** pid:18637)] ReportJob failed with NoMethodError: undefined method `each' for #<Title:0x007ff20c1ec1b0> - 0 failed attempts
[Worker(host:*** pid:18637)] ReportJob failed with NoMethodError: undefined method `each' for #<Title:0x007ff20ec47f18> - 1 failed attempts
[Worker(host:*** pid:18637)] 2 jobs processed at 10.5219 j/s, 2 failed ...
我的 perform 方法代码是:
def perform
Title.find_each do |titles|
csv_data = CSV.generate do |csv|
titles.each do |t|
csv << t.to_csv
end
end
user_job = UserJob.find(user_job_id)
user_job.update_attribute :data, csv_data
end
end
任何人都可以看到问题可能是什么,我想我在循环事物的方式上犯了一个愚蠢的错误。
我非常愿意接受有关如何完成相关要求的任何其他建议,但请记住我对 Heroku 的限制。
【问题讨论】:
-
已经对我的代码进行了编辑,因为我刚刚看到我忘记将 CSV.generate 分配给 csv_data 以用于更新记录。
标签: ruby-on-rails csv scalability delayed-job ruby-on-rails-3.2