如果不在会话中,如何/在何处临时存储ActiveRecord对象?

时间:2010-02-20 08:20:34

标签: ruby-on-rails session activerecord refactoring

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

我的问题是:

A)即使在其他地方不存在记录,在会话中存储记录仍然存在问题吗?即使我修改模型,也不能杀死所有现有的会话?

B)如果它可能导致问题,我应该如何暂时存储对象?我应该保存它们并使用布尔标志来表示永久状态和临时状态吗?然后用cron编写一个脚本来清除陈旧的临时对象?

思想?

2 个答案:

答案 0 :(得分:5)

为什么不将它们存储在数据库中,但是你知道它们“不完整”?

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

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

答案 1 :(得分:1)

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

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

但是,如果您真的想在会话中存储对象,请尽可能存储最少量的信息。仅适用于ID和更新字段。还将信息存储为哈希,而不是直接将对象存储在会话中。