【问题标题】:How/where to temporarily store ActiveRecord objects if not in session?如果不在会话中,如何/在哪里临时存储 ActiveRecord 对象?
【发布时间】:2016-09-01 01:09:09
【问题描述】:

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

我的问题是:

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

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

想法?

【问题讨论】:

    标签: ruby-on-rails session activerecord refactoring


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这是要走的路。从概念上讲,使用该模型对我来说是有意义的。临时的、尚未生效的数据不应该在数据库中,对吧?但是,实际上,我可以看到它没有意义,并且这种类型的解决方案将更加健壮。感谢您的意见。
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,如果您必须使用会话,我认为这是要走的路。我还考虑过将部分记录存储在数据库中,但仅使用将各个 user_id 与部分记录的 id 相关联的哈希通过会话将它们与用户相关联。我相信这会起作用,但它不必要地依赖于会话。 Simone 的解决方案应该做同样的事情,但更好。
    猜你喜欢
    • 2012-02-24
    • 2015-07-23
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2023-03-14
    相关资源
    最近更新 更多