Rails序列化我的对象One Way&拒绝改变

时间:2010-02-25 22:18:42

标签: ruby-on-rails serialization

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

  

班级统计<的ActiveRecord ::基

     

序列化:用户列表

     

当加载统计对象并且其用户列表从String更改为Array用户列表时,总是被序列化回String。该框架似乎记住并反序列化:userlist成为一个String,即使它作为一个数组进入。

>> s = Statistic.find 238
=> #<Statistic id: 238, userlist: "--- \n- 2222437\n- \"99779\"\n- \"120429\"\n- \"210503\"\n- 32...">
# Note here: :userlist is an Array in YAML. Why doesn't it get correctly deserialized?

>> s.userlist.class
=> String
>> s.userlist = s.userlist.split(/\s+/)

>> s.userlist.class
=> Array

>> s.save
=> true

>> s.reload
=> #<Statistic id: 238,userlist: "--- \n- 2222437\n- \"99779\"\n- \"120429\"\n- \"210503\"\n- 32...">

>> s.userlist.class
=> String

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

  

ActiveRecord :: SerializationTypeMismatch:用户列表应该是一个数组,但是是一个字符串

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

% rails --version
Rails 2.3.4

2 个答案:

答案 0 :(得分:1)

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

要回答这个问题,IIRC您可以将class_name传递给序列化。

serialize :userlist, :class_name => 'Array'

或者尝试:

serialize :userlist, Array

我希望这有帮助!

答案 1 :(得分:1)

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

>> YAML::load(s.userlist)
ArgumentError: syntax error:ScannerException while scanning a quoted scalar we had this found unexpected end of stream
        from (irb):8

AR :: B的代码是

      def object_from_yaml(string)
        return string unless string.is_a?(String) && string =~ /^---/
        YAML::load(string) rescue string
      end

有些数据长度超过65,535个字符,溢出了mysql文本列。