【问题标题】:Rails Seralized My Object One Way & Refuses to ChangeRails 以一种方式序列化我的对象并拒绝更改
【发布时间】:2010-02-25 22:18:42
【问题描述】:

我有一个序列化一个属性的 rails 类。

类统计<:base>

序列化:用户列表

结束

当加载统计对象并且它的用户列表从字符串更改为数组时,用户列表总是会被序列化回字符串。该框架似乎会记住并将 :userlist 反序列化为字符串,即使它作为数组进入也是如此。

>> s = Statistic.find 238 => # # 注意这里::userlist 是 YAML 中的一个数组。为什么它不能正确反序列化? >> s.userlist.class => 字符串 >> s.userlist = s.userlist.split(/\s+/) >> s.userlist.class => 数组 >> s.保存 => 真 >> s.reload => # >> s.userlist.class => 字符串

本练习的目标是将所有字符串用户列表转换为数组。 如果我在转换之前更改类(serialize :userlist, Array),我会收到 TypeMismatch 异常。

ActiveRecord::SerializationTypeMismatch: userlist 应该是一个数组,但实际上是一个字符串

有没有办法强制 AR 将用户列表解释为数组?

% rails --version
Rails 2.3.4

【问题讨论】:

    标签: ruby-on-rails serialization


    【解决方案1】:

    您没有为此使用常规关联是否有特殊原因?

    要回答这个问题,IIRC 你可以通过class_name 进行序列化。

    serialize :userlist, :class_name => 'Array'
    

    或者尝试:

    serialize :userlist, Array
    

    我希望这会有所帮助!

    【讨论】:

    • serialize :userlist, Array 是正确的语法。
    • 在这种情况下,常规关联不必要地繁重。我知道如何将 new 记录放入数组中。如果我现在更改类,带有 String :userlist 属性的 existing 对象会抛出异常。该框架似乎会记住并将 :userlist 反序列化为字符串,即使它作为数组进入也是如此。
    【解决方案2】:

    发现问题。字符串不正确 YAML:

    >> YAML::load(s.userlist)
    ArgumentError: syntax error:ScannerException while scan aquoted scalar we have this found unexpected end of stream
            来自 (irb):8
    

    来自 AR::B 的代码是

     def object_from_yaml(string)
            返回字符串除非 string.is_a?(String) && string =~ /^---/
            YAML::load(string) 救援字符串
          结尾
    

    部分数据长度超过 65,535 个字符,溢出 mysql 文本列。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2012-11-14
      • 2020-07-17
      • 2017-10-30
      相关资源
      最近更新 更多