有没有办法使用HashWithIndifferentAccess序列化ActiveRecord的JSON属性?

我在Rails应用程序中使用ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 。 假设我有一个架构:

  create_table "foo", id: :bigserial, force: :cascade do |t| t.string "name" t.jsonb "data", null: false end 

现在假设我运行以下代码:

 class Foo  'foobar', :data => {:a => 'hello'}) my_foo = Foo.where(:name => 'foobar').first! puts my_foo.data[:a] puts my_foo.data['a'] 

输出将是:

 # nil # 'hello' 

是否可以让ActiveRecord使用HashWithIndifferentAccess自动反序列化jsonb类型?

| 您可以使用自定义序列化程序,以便您也可以使用符号访问JSON对象。

 # app/models/user.rb class User < ActiveRecord::Base serialize :preferences, HashSerializer end # app/serializers/hash_serializer.rb class HashSerializer def self.dump(hash) hash.to_json end def self.load(hash) (hash || {}).with_indifferent_access end end 

完全信用 - 没有谷歌搜索 - 访问http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails 。

如果您的根对象是一个数组,则需要稍微区别对待它。

Rails 5+

 class User < ActiveRecord::Base serialize :preferences, HashSerializer serialize :some_list, ArrayHashSerializer end class HashSerializer def self.dump(hash) hash end def self.load(hash) (hash || {}).with_indifferent_access end end class ArrayHashSerializer def self.dump(array) array end def self.load(array) (array || []).map(&:with_indifferent_access) end end 

Rails <= 4

 class User < ActiveRecord::Base serialize :preferences, HashSerializer serialize :some_list, ArrayHashSerializer end class HashSerializer def self.dump(hash) hash.to_json end def self.load(hash) (hash || {}).with_indifferent_access end end class ArrayHashSerializer def self.dump(array) array.to_json end def self.load(array) (array || []).map(&:with_indifferent_access) end end