【问题标题】:Serializing ActiveRecord objects without storing their attributes?序列化 ActiveRecord 对象而不存储其属性?
【发布时间】:2010-03-26 07:48:08
【问题描述】:

我正在解决一个问题,我需要在数据库中存储 Ruby 对象的序列化层次结构。许多需要保存的对象是具有很多属性的 ActiveRecord 对象。与其保存整个对象,然后在加载它们时从数据库中刷新它们的属性(以防它们发生变化,这很可能),不如只存储这些对象的引用(类和数据库 ID)会更容易。

有谁知道在 Rails 中是否已经有办法做到这一点,或者是否有现有的 gem?想在花费大量时间破解之前检查某些东西是否存在。

【问题讨论】:

    标签: ruby-on-rails ruby serialization activerecord


    【解决方案1】:

    据我了解您的问题,您应该使用谷歌搜索:acts_as_nested_setbetter_nested_seteven_better_nested_setawesome_nested_set。我知道他们不存储序列化的层次结构,但您应该以原子方式存储它们的节点。即使是巨大的流量网站也会这样做。除此之外 - 你应该考虑 NoSQL(或无模式数据库)。

    【讨论】:

      【解决方案2】:

      据我了解您的问题,您应该添加模型:serialize field_name 并将所有属性嵌套对象推送到该字段。 Rails 将使用 gem Marshal 序列化这个对象。

      有一些使用Marshal 没有rails 和ActiveRecord 的序列化示例。 this - 是 Stack Overflow 上的答案,它是如何工作的。

      【讨论】:

      • 这行得通,也是我现在正在做的事情,但它存储了对象的所有属性。然后在反序列化之后,无论如何我都必须重新加载 ActiveRecord 对象,因为它们可能在 DB 中发生了变化,因此浪费了大量空间来编组被丢弃的属性(由更新的属性替换)。我想破解 :serialize/Marshal 所以它会存储 activerecord 对象的 id 并从数据库中重新加载它们。
      • 您需要在您的 ruby​​ 类上实现 marshal_load 和 marshal_dump 方法。您可以选择要序列化的属性和要加载的属性。有关详细信息,请参阅potapuff 链接的答案。 (+1)
      • 我认为序列化使用 YAML,而不是 Marshal。如果您想精确控制要序列化的内容,请引入一个不扩展 AR::Base 的类,并实现 to_yaml_properties。然后只需将此类的实例序列化到 AR 对象上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多