为什么ActiveRecord的序列化会随机破坏我的数据?

时间:2008-10-02 12:49:13

标签: ruby activerecord yaml serialization

我在一个serialize模型中使用ActiveRecordArray个简单哈希序列化为文本数据库字段。我甚至使用第二个参数将反序列化强制转换为Array s。

class Shop < ActiveRecord::Base
  serialize : recipients, Array
end

它似乎工作正常,但在一些请求之后,recipients的内容变为HashOfIndifferentAccess哈希而不是数组。这只发生在重新加载一些模型之后,我无法在测试或控制台中重现它,只能在生产环境中重现。

2 个答案:

答案 0 :(得分:2)

我的一个Rails 3.1应用程序中的一些序列化字段遇到了同样的问题。经过大量的故障排除后,我将其缩小为字符编码问题。我无法在本地重现它,因为我使用的是SQLite,而我的生产环境是在Postgres上。

尝试在序列化之前对所有值应用some_field.force_encoding(Encoding::UTF_8),看看会发生什么。

答案 1 :(得分:1)

这似乎是你应该能够通过足够的测试在本地重现的东西。 查看生产数据库和日志,并尝试在本地测试中使用相同的数据。

hashwithindifferentaccess来自控制器。也许你是直接从控制器获取数据而不是按摩它。

创建页面,控制器和模型保存代码的要点,并更新此问题。 根据您的哈希嵌套的深度,您可以在保存之前将HWIA哈希转换为常规哈希。

不应该太难调试和解决。