在ruby on rails中跨请求持久化ActiveRecord对象



我正试图找到一种方法,以最有效的方式在请求中持久化ActiveRecord对象。

用例如下:用户提供一些参数并单击"显示预览"。当这种情况发生时,我会做大量的背景计算来生成预览。在这个过程中创建了许多ActiveRecord对象。看到预览后,用户单击"提交"。我不想在这里重新计算所有内容,而是简单地保存由上一个请求创建的ActiveRecord对象。不能保证这两个请求总是发生(例如,用户可能在看到预览后选择退出,在这种情况下,我想从持久层中删除这些对象)。

是否有任何行之有效的方法来实现上述目标?看起来这应该是一个常见的场景。我不能使用会话,因为数据可能超过分配给会话数据的空间。此外,我宁愿不将这些对象保存到DB中,因为用户在技术上还没有"提交"数据。因此,我想要的更多的是一个内存中的持久层,它可以保证在执行第二个请求时这些对象的存在。

谢谢。

只需将其保存到DB中,而不向应用程序添加其他不真正持久的层,就可以节省大量不必要的工作。

一种可能的方法:使用state属性来判断您的记录处于何种状态(例如"draft"、"committed")。然后运行一个垃圾收集器来删除在特定时间段内未提交的草稿(及其相邻记录)。

我不确定不将对象保存在脏状态是否是最好的选择,因为您可以使用某种控制属性(如state或status)来管理它。

这样做也非常好,因为您可以在过程中验证数据,直到用户决定提交所有内容才进行验证。我知道Ryan Bates有一个制作这种复杂形式的演员阵容(http://railscasts.com/episodes/217-multistep-forms)。

希望它能有所帮助。

是因为您使用基于cookie的会话,所以数据会超过分配给会话数据的空间吗?如果您需要更多空间,为什么不使用基于活动记录的会话?从基于cookie的会话进行更改很简单,而且实际上是推荐的方式(所以我不知道为什么它不是默认的)

最新更新