Ruby 通过序列化将哈希保存到数据库中的列(类型:text),为什么要保存为YAML

Ruby 通过序列化将哈希保存到数据库中的列(类型:text),为什么要保存为YAML,ruby,ruby-on-rails-3,serialization,hash,yaml,Ruby,Ruby On Rails 3,Serialization,Hash,Yaml,我们正在尝试序列化一个名为differences的属性,以便将该属性的值作为散列保存到数据库中。差异的类型是文本。它过去被保存为数据库中的散列。但最近我们发现它被保存了yaml。有没有办法防止它保存为yaml Class A < ActiveRecord::Base has_many :bs serialize :differences def diff(other) b_diffs = {} bs.zip(other.bs).eac

我们正在尝试序列化一个名为differences的属性,以便将该属性的值作为散列保存到数据库中。差异的类型是文本。它过去被保存为数据库中的散列。但最近我们发现它被保存了yaml。有没有办法防止它保存为yaml

  Class A < ActiveRecord::Base

    has_many :bs
    serialize :differences

    def diff(other)
      b_diffs = {}
      bs.zip(other.bs).each do |a,b|
       b_diffs.merge!(:bs => a.diff?(b)
      end
    end

    def diff_against_last_a
      last_a = ....
      self.differences = last_a.diff(self)
    end
  end
Class Aa.diff?(b)
结束
结束
定义与上一个定义的差异
最后的a=。。。。
自我差异=最后的自我差异
结束
结束
有什么建议吗

编辑: 我的问题是我无法将差异检索为散列


有趣的是,当我在控制台上检查时,它被保存为yaml,并被检索为yaml。然后我重新运行diff(other)方法并将结果保存到differences,它显示为Hash,我可以检索Hash。但在我的应用程序上运行时,它不会以这种方式工作

我认为这里的问题是序列化数据不再返回哈希

更新:
所以我发现在开发环境下有这样一个问题,但是在生产和分级(我们使用HeloCu),它实践得很好,所以我们会认为它可以。然后,

< P>除了我的评论,这里有正式的描述:

如果您有一个属性需要作为 对象,并作为同一对象检索,然后指定 使用此方法创建该属性,并将自动处理该属性。 序列化是通过YAML完成的。如果指定了class_name, 序列化对象在检索时必须是该类的,或者 将引发SerializationTypeMismatch

资料来源:

用外行的话说,“当Rails序列化散列以保存在db中时,它所做的只是将其转换为YAML,以便将其存储为字符串。”

正如官方描述的最后一行所述,您已经定义了检索类。
Hash
在您的案例中。因此,声明序列化如下:

 serialize :differences, Hash

yaml
是rails中的默认序列化。这里的问题是什么?如果您尝试在rails环境中检索
differences
,它仍然是一个
Hash
.hmm。当我检索differences时,它将变成一个字符串,不再是Hash。我不理解的是它用于检索,例如,{:a=>{:b=>{attr\u 1:2}现在它就像“-\n:a\n:b\n:attr\u 1\n 2\n”检索后。不确定原因。我需要的是散列。因为您尚未定义序列化类型。我正在更新我的答案。请检查我是否更新了答案,在发布此消息之前,它没有工作。它在未定义其序列化类型的情况下工作。请尝试按照我在答案中更新的内容进行序列化,然后保存新的散列并尝试检索它。它应该可以正常工作。如果您需要的话r控制台是打开的,您正在尝试检索散列,在进行更改后重新启动它。这很重要!有趣的是,当我检查控制台时,它被保存为yaml,并被检索为yaml。然后我重新运行方法diff(其他)并将结果保存到Differences,它显示为Hash,我可以检索Hash。但在我的应用程序上运行时,它不会以这种方式工作。尝试定义Hash。控制台已重新启动。我确定。重新启动服务器和控制台。如果它在一个位置工作,它也应该在另一个位置工作,从逻辑上讲,我很抱歉,它仍然不工作。我们正在使用rubrails 3.2.13上的y。这会是一个版本问题吗?从逻辑上讲,我认为它应该以这种方式工作。