Десериализовать ActiveRecord из JSON - PullRequest
1 голос
/ 24 октября 2011

Я хотел бы сохранить результат запроса в redis с использованием сериализации JSON и запросить его обратно.

Получить результаты запроса в json довольно просто:

JSON.generate(Model.all.collect {|item| item.attributes})

Однако я не нашел подходящего способа десериализации его обратно в ActiveRecord. Самый простой способ:

JSON.parse(@json_string).collect {|item| Model.new.from_json(item)}

выдает ошибку:

WARNING: Can't mass-assign protected attributes: id

Итак, id становится пустым. Я думал об использовании OpenStruct для представлений вместо ActiveRecord, но я уверен, что есть лучший способ.

Ответы [ 2 ]

8 голосов
/ 18 июня 2012

Вы можете создать экземпляр нового объекта из JSON, а затем назначить идентификатор. Вероятно, лучше всего создать собственный метод для этого:

class Model
  def self.from_json_with_id(params = {})
    params = JSON.parse(params)
    model = new(params.reject {|k,v| k == "id"})
    model.id = params["id"]
    model
  end
end

Или, может быть, просто переопределить метод from_json().

1 голос
/ 24 октября 2011

Почему бы не так:

JSON.parse(@json_string).each do |item|
     item.delete(:id) # I tested it in my case it also works without this line
     object=Model.create(item)
end

Если хост, создавший JSON, добавляет корень JSON, возможно, вам придется использовать item[1] вместо item.

...