ActiveRecord сериализируют использование JSON вместо YAML

У меня есть модель, которая использует сериализированный столбец:

class Form < ActiveRecord::Base
  serialize :options, Hash
end

Существует ли способ заставить эту сериализацию использовать JSON вместо YAML?

55
задан Marc-André Lafortune 19 January 2010 в 02:25
поделиться

2 ответа

Обновление

См. Высокий рейтинтовый ответ в 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"]}

PS:

Это не совсем сухое, но я сделал все возможное. Если кто-то может исправить all_find в , модели , это будет здорово.

11
ответ дан 26 November 2019 в 17:33
поделиться

Мои требования не нуждались в большом использовании кода на данном этапе, поэтому мой дистиллированный код является вариантом на вышеуказанном ответе:

  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  

ура, довольно легко в конце!

8
ответ дан 26 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: