跨Rails请求的持久性:在类级模型中存储大量数据

时间:2017-04-27 21:32:49

标签: ruby-on-rails

我有很多数据需要通过多步骤表单来保存。我不想在隐藏的html元素中加载元素,因为它会使页面无响应。我不需要在请求之间向用户显示所有数据。数据也可能超出cookie限制。

我已就此主题进行了研究。我读了这个post。从本质上讲,它表明:

  

Rails进程通过加载框架来开始其生命周期   应用。它们通常只运行一个线程   在其生命周期内处理许多请求。因此,请求将是   严格按顺序发送。

这对我来说很准确。我正在使用Nginx的免费版Phusion Passenger。因此,没有多线程。

然后声明:

  

尽管如此,所有类都会在请求中持续存在。这意味着任何   从您的类引用的对象将在请求之间共享。

所以我认为我可以这样做:

# user.rb
class User < ActiveRecord::Base
  attr_accessor :large_amount_of_data
end

# users_controller.rb
def update
  User.large_amount_of_data = User.parse_csv(params[:alot_of_data])
end

然后在表单的最后一步,我可以使用User.large_amount_of_data

引用数据

现在我知道Passenger会产生多个Rails进程以抵消其单线程性质。正如帖子所说:

  

在等待慢速时阻止所有请求根本不是很酷   数据库查询,所以简单的方法是产生更多的进程。   当然,这些过程不共享任何东西(除了一些记忆   也许,你不会注意到的)。 如果你保存东西,这可能会咬你   在请求期间的类变量或类实例变量中。   然后,不知何故,有时东西似乎存在,并且   有时它似乎消失了。(实际上,当然,数据可能会   或者可能不存在于某个过程中,而在其他过程中则不存在。)

  

每次请求后都会丢弃所有控制器实例,但正如我们所说   知道,这些课程是共享的。如果你通过,这可能会咬你   类变量或类实例变量中的信息。   如果您没有正确使用同步方法,您可能会很好   最终陷入竞争状态地狱。

因此,如果请求A中的用户正在使用多步形式,并且我将数据存储在类方法中,并且生成另一个Passenger进程,请求B,则类方法中的数据可能会因Request而消失一个?请求A中填充的数据是否在请求B中可用(在不同的进程上运行)?鉴于我的Phusion Passenger / Rails 4 / Nginx堆栈,假设这类数据的完整性是否安全?或者有更好的解决方案吗?

0 个答案:

没有答案