我目前正在开发一个需要解析一些(大文件)csv数据的应用程序。我必须执行几个步骤来操作数据并将其映射到ActiveRecord对象。这必须分几个步骤完成,我必须在视图中显示结果。
所以我从进口#index入手。在这里,我让用户上传csv文件,没有什么花哨的
然后我通过导入#create来创建导入对象。
然后我在step2进口#show。在这里我显示结果。所以在导入#show我解析了所有csv数据并删除了我不需要的行。 (这是一个包含结构的大阵列。)
然后我想转到第3步进一步操作相同的数据。但是在世界上如何在没有会话的情况下从step2中的step2获取大数组(因为Structs我无法在会话中插入它,它会给我以下错误:TypeError (can't dump anonymous class #<Class:0x105477128>):
当我把它放在与.inspect的会话中时,它会引发这个错误:ActionDispatch::Cookies::CookieOverflow
。但后来它只是一个大字符串,我想保持ruby功能(例如它是一个包含struct对象的大数组......)
所以将它全部包装起来
第1步 上传文件 第2步 解析数据&amp;操纵它。 第三步: 使用步骤2中的数据(没有会话..) 第4步 来自step3的用户数据
我怎样才能让这个工作起作用......我似乎无法弄明白:&lt;
答案 0 :(得分:3)
你应该记住不同的原则:
控制器无意处理数据,模型或类别
解析一个大文件不应该在控制器内部进行,而是放在一些队列中(Delayed Job正确处理它,看看它是如何工作的here)。想象一下你的用户无休止地等待发生的事情......
总结一下:
第1步:上传文件=&gt;好吧,我猜你救了它,很棒
Step2解析数据&amp;操纵它=&gt;应由步骤1触发并在延迟作业队列中启动
步骤3使用步骤2中的数据(没有会话..)=&gt;所有数据都按我建议的方式处理,可以存储在缓存,数据库或任何有用的地方
步骤4来自步骤3的用户数据=&gt;你想显示你的处理结果,我建议你实现一个AJAX请求,检查作业是否完成(为此,我强烈建议你将信息存储在缓存中,以免经常查询你的数据库)。