无法再作为ActiveSupport :: HashWithIndifferentAccess序列化

由于我到目前为止完全无法解密的原因,我不再能够使用ActiveSupport :: HashWithIndifferentAccess了。

模型的相关部分如下所示:

class Item < ActiveRecord::Base serialize :metadata, ActiveSupport::HashWithIndifferentAccess 

(我添加了尝试强制它的选项,但它没有帮助。以前这一切都工作正常,我没有那里。)

只要对象在内存中,一切正常。 这是正确的HashWithIndifferentAccess,生活是美好的。 一旦它被保存到数据库,它就会被保存为Hash:

 mysql> select * from items; +----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ | id | link | text | metadata | category_id | +----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ | 1 | NULL | Apple Store | --- id: 42cc7080f964a520e9251fe3 name: Apple Store contact: phone: '4153920202' formattedPhone: (415) 392-0202 location: address: 1 Stockton St. crossStreet: at Ellis St. lat: '37.78573590563453' lng: '-122.40610713227913' distance: '1784' postalCode: '94108' city: San Francisco state: CA country: USA categories: '0': id: 4bf58dd8d48988d122951735 name: Electronics Store pluralName: Electronics Stores shortName: Electronics icon: http://sofzh.miximages.com/ruby-on-rails/technology.png parents: - Shops & Services primary: 'true' verified: 'false' stats: checkinsCount: '30462' usersCount: '16105' tipCount: '128' url: http://apple.com/sanfrancisco hereNow: count: '7' | 1 | +----+------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+ 

这意味着它不能被强制回HashWithIndifferentAccess并且事情就像这样爆炸:

 ActiveRecord::SerializationTypeMismatch in Index#index Showing /development/lists.io/website/app/views/users/_todo.html.haml where line #7 raised: Attribute was supposed to be a ActiveSupport::HashWithIndifferentAccess, but was a Hash 

这是使用Rails 3.1.3,使用mysql2 gem版本0.3.10将数据存储在MySQL中。 我也在运行ruby 1.9.2p290。 我可以添加任何人认为有用的信息,但我不知道如何进一步调试。

1.9.2通常包括Psych作为YAML库。 但是,libyaml是一个外部依赖项,如果在编译Ruby时libyaml不可用,则1.9.2默认使用Syck(旧库): link

Psych YAML-izes ActiveSupport :: HashWithIndifferentAccess作为标准哈希的事实是Psych的Github上的一个突出问题 。 似乎在1.9.3中已修复。

显然这只是在1.9.2-p290的情况下直接打破了。

升级到1.9.3,或降级到1.8.7,一切都很好。 不过,如果有人有任何想法,我会比这更好的答案。

如果可以,请切换到syck。

在application.rb中:

 require 'yaml' YAML::ENGINE.yamler = 'syck' 

以防万一我遇到过同样的问题,这与此类似,但不一样,我在这里发布答案。 我有一个在模型中序列化的哈希,它正确地保存到数据库。 在一个接口中,我需要在JS中重新生成散列,然后在db中创建包含!map:ActiveSupport :: HashWithIndifferentAccess而不是正确数据的条目。 我将哈希生成为字符串,然后使用eval转换为哈希。 这会根据需要创建一个Hash。 但是我当时把哈希放回到params哈希中,所以我可以在控制器中使用update_attributes,它将它转换为HashwithIndifferentAccess,导致问题