我正在存储大型对象,这是一个巨型哈希,具有嵌套的哈希,数组,字符串等。 这个here有一个非常简单的问题。这给出了以下猴子补丁:
class Hash
def to_utf8
Hash[
self.collect do |k, v|
if (v.respond_to?(:to_utf8))
[ k, v.to_utf8 ]
elsif (v.respond_to?(:encoding))
[ k, v.dup.encode('UTF-8') ]
else
[ k, v ]
end
end
]
end
end
这个答案很棒,但似乎没有超过1级,我不知道如何将它重构为蜘蛛。
答案 0 :(得分:0)
如果无论如何可能,而不是修复症状,尝试在源头修复问题。应用程序堆栈中的某个位置编码是偏斜的。如果你能解决这个问题,它可能是最稳定,最有效的方法。
否则你将不得不遍历整个MongoDB文档并按下这些值(不要忘记密钥,它们也作为字符串存储在MongoDB中),并按照以下步骤进行操作:
if text.respond_to?(:to_utf8)
text.to_utf8
elsif text.respond_to?(:encoding)
text.encode('utf-8')
else
text
end
我无法帮助您浏览文档,因为我需要有关模型结构及其持久性的更多信息。
修改强>
我喜欢这个解决方案,而不是遍历模型树:https://stackoverflow.com/a/15789340/436112。将其视为JSON并对整个文档进行编码/解码,修复过程中的UTF-8编码问题