有没有办法使用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