2015-02-23 3 views
2

Я использую ActiveRecord::ConnectionAdapters::PostgreSQLAdapter в приложении Rails. Предположим, у меня есть схема:Есть ли способ сериализации свойств JSON ActiveRecord с использованием HashWithIndifferentAccess?

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

Теперь предположим, что я бегу следующий код:

class Foo < ActiveRecord::Base 
    self.table_name = :foo 
end 

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

Выходной сигнал будет:

# nil 
# 'hello' 

Можно ли попросить ActiveRecord автоматически десериализации jsonb типы с использованием HashWithIndifferentAccess?

+1

'def data; HashWithIndifferentAccess.new (супер); end' является обходным путем, если ничего лучше не приходит. –

+1

@muistooshort другой способ выразить это 'super.with_indifferent_access'. –

ответ

4

| Вы можете использовать собственный сериализатор, чтобы вы могли также получить доступ к объекту 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.

Смежные вопросы