2010-02-20 71 views
9

我正在重构一个基于Rails的事件注册应用程序,该应用程序具有一个结帐过程,可以击中多个ActiveRecord模型。理想情况下,除非结账完成(付款已成功处理),否则不应保存这些对象。我不完全确定为什么暂时将这些对象序列化到会话中会是一件坏事,但我一遍又一遍地阅读了它的不好的mojo。至少不存在与现有记录不同步的风险,因为不存在任何现有记录。如果不在会话中,如何临时存储ActiveRecord对象?

我的问题是:

A)是不是还是有问题的会话中所存储记录,即使它们并不存在于其他地方?即使我修改模型,我是不是可以杀死所有现有的会话?

B)如果可能导致问题,我应该如何临时存储对象?我应该保存它们并使用布尔标志来指示永久状态还是临时状态?然后cron脚本来清除过时的临时对象?

想法?

回答

5

为什么你不把它们存储在数据库中,但以一种你知道它们是“不完整”的方式?

例如,您可以添加一个added_to_cart_at日期时间字段。将产品添加到购物车时,保存该记录并设置该字段的值。然后,如果用户完成购买,则清除该字段,并将产品与订单关联。

要清除陈旧记录,您可以设置每日cron删除added_to_cart_at年龄大于1.day.ago的所有记录。

+0

我认为这是要走的路。从概念上讲,使用该模型对我来说很有意义。临时的,尚未生效的数据不应该在数据库中,对吗?但实际上,我可以看到它没有意义,这种解决方案将更加强大。感谢您的输入。 – tacomachine 2010-02-21 20:01:34

1

将它们存储在会话中的问题是会话空间有限。存储在会话中时,ActiveRecord对象在空间方面会带来很多开销。如果你存储的人口密集has_many关系的记录,你会遇到麻烦。

我相信Simone Carletti关于在数据库中存储部分记录的描述是最好的解决方案。

但是,如果您确实想要在会话中存储对象,请存储尽可能少量的信息。例如只有ids和更新的字段。还将信息存储为散列,而不是直接将对象存储在会话中。

+0

是的,我认为如果您必须使用会话,这是一条路。我曾经考虑的是将部分记录存储在数据库中,但只通过会话使用将各自的user_id与部分记录的ID相关的散列将其与用户相关联。我相信这会起作用,但它会不必要地依赖会话。 Simone的解决方案应该做同样的事情,但更好。 – tacomachine 2010-02-21 20:07:24