我有一个用于序列化一个属性的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
答案 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文本列。