У меня есть модель, которая использует сериализированный столбец:
class Form < ActiveRecord::Base
serialize :options, Hash
end
Существует ли способ заставить эту сериализацию использовать JSON вместо YAML?
Обновление
См. Высокий рейтинтовый ответ в Mid's ниже для гораздо более подходящих рельсов> = 3.1 Ответ. Это отличный ответ для рельсов <3.1.
Вероятно, это то, что вы ищете.
Form.find(:first).to_json
Обновление
1) Установите «JSON» GEM :
gem install json
2) Создать класс JSONWAPPER
# lib/json_wrapper.rb
require 'json'
class JsonWrapper
def initialize(attribute)
@attribute = attribute.to_s
end
def before_save(record)
record.send("#{@attribute}=", JsonWrapper.encrypt(record.send("#{@attribute}")))
end
def after_save(record)
record.send("#{@attribute}=", JsonWrapper.decrypt(record.send("#{@attribute}")))
end
def self.encrypt(value)
value.to_json
end
def self.decrypt(value)
JSON.parse(value) rescue value
end
end
3) Добавить обратные вызовы модели:
#app/models/user.rb
class User < ActiveRecord::Base
before_save JsonWrapper.new( :name )
after_save JsonWrapper.new( :name )
def after_find
self.name = JsonWrapper.decrypt self.name
end
end
4) Проверьте его!
User.create :name => {"a"=>"b", "c"=>["d", "e"]}
Это не совсем сухое, но я сделал все возможное. Если кто-то может исправить all_find
в , модели
, это будет здорово.
Мои требования не нуждались в большом использовании кода на данном этапе, поэтому мой дистиллированный код является вариантом на вышеуказанном ответе:
require "json/ext"
before_save :json_serialize
after_save :json_deserialize
def json_serialize
self.options = self.options.to_json
end
def json_deserialize
self.options = JSON.parse(options)
end
def after_find
json_deserialize
end
ура, довольно легко в конце!