【问题标题】:Caching ActiveRecord object and associations缓存 ActiveRecord 对象和关联
【发布时间】:2009-04-05 07:29:49
【问题描述】:

我希望能够将 ActiveRecord 模型的 10 个实例及其所有关联“深度克隆”到内存中,对它们进行处理,更新内存中的对象,然后,当我完成后,选择一个回写数据库中的原始数据。

  1. 如何进行深度克隆(即 .clone 以及将所有关联克隆到关联树的底部)?到目前为止,我假设我将不得不在模型中编写自己的方法。

  2. 在我准备好之前,如何确保所有克隆实例都不会写回数据库?

如果可能的话,我想:-

  1. 保留所有当前 ID,因为我的主要关联之一是 has_many :through 将一个模型的 ID 匹配到另一个模型

  2. 仍然能够像对待数据库中一样对待每个克隆(即 .find_by_id 等将起作用)

也许是一根棍子上的月亮? ;)

【问题讨论】:

    标签: ruby-on-rails activerecord caching


    【解决方案1】:

    不是 100% 确定您要做什么......

    只有调用 save 方法时,模型才会存储在数据库中。在现有模型中调用 save 将使用已更改的任何数据更新数据库。关联也可以保存,但它实际上取决于关联的类型,在大多数情况下,您可能还需要在这些模型上调用 save。

    【讨论】:

      【解决方案2】:

      哇!有时,您需要先提出愚蠢的问题,然后才能看到明显的答案。

      我的问题是我不得不对关联的对象进行更改,并且当我稍后使用这些内存中的对象时它们没有显示出来,所以我认为我必须保存。然而,你是对的。实际发生的只是引用它们的变量超出了范围,因此我改为访问数据库中的变量。

      我将回顾我的代码并检查是否是这种情况。

      话虽如此,但它并没有回答我关于“深度克隆”的问题......

      【讨论】:

        【解决方案3】:

        我已经使用 DefV 的深度克隆插件解决了我们的深度克隆问题:http://github.com/DefV/deep_cloning

        到目前为止,它已经完成了我所要求的一切,但正如您发现的那样,您需要非常注意自己的人际关系。幸运的是,我的测试显示这是一个问题,我目前正在解决它。我在尝试解决它时发现了这篇文章:)

        查看插件,它非常方便。

        【讨论】:

        • 谢谢。自从我参加 SO 以来已经有一段时间了,所以为迟到的回复道歉:)
        猜你喜欢
        • 2015-03-26
        • 2012-11-17
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 2013-08-16
        相关资源
        最近更新 更多