【问题标题】:What object can I serialize in ActiveRecord?我可以在 ActiveRecord 中序列化什么对象?
【发布时间】:2013-10-12 22:26:23
【问题描述】:

我很乐意使用serialize :my_array, Arrayserialize :my_hash, Hash 方便地将设置和数组存储在数据库中。

我还能以这种方式使用哪些其他对象?例如,我知道我可以使用StructOpenStruct,但是我怎么知道一个对象是否可以使用ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以这样使用 Set 类(请注意,它应该被称为 UniqArray)?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord serialization


    【解决方案1】:

    此代码确定 Rails 的serialize 方法中用于序列化的编码器:

     if [:load, :dump].all? { |x| class_name.respond_to?(x) }
       class_name
     else
       Coders::YAMLColumn.new(class_name)
     end
    

    简而言之:如果Object 本身具有loaddump 方法,则可以序列化Object。或者如果YAML可以loaddumpObject。以这种方式检查:

    object == YAML.load(YAML.dump(object))  # with require 'yaml' in irb
    

    【讨论】:

      【解决方案2】:

      AR 中的序列化使用 Psych 将实例转储到 yaml 字符串中。

      Psych 反过来知道如何序列化从 Object 继承的所有对象(它几乎是 Ruby 中的所有对象)。

      一般情况下,Psych 获取对象的所有实例变量并将其转储为 yaml 字段。

      转储几个类也有特殊情况,如ArrayClassDateDateTimeExceptionFalseClassFloatHashIntegerModuleNilClassRangeRationalRegexpStringStructSymbolTimeTrueClass等一些很少用到的。 >

      例如,如果我们有class UniqArray < Set 和实例UniqArray.new([1,2,3]) - 转储的字符串将是"--- !ruby/object:UniqArray\nhash:\n 1: true\n 2: true\n 3: true\n"(其中hash 是实现集合存储的实例变量名称)

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        相关资源
        最近更新 更多