从JSON反序列化ActiveRecord

mbd*_*dev 1 json ruby-on-rails mass-assignment deserialization

我想使用JSON序列化将查询结果保存到redis中并查询它.

将查询结果提供给json非常简单:

JSON.generate(Model.all.collect {|item| item.attributes})
Run Code Online (Sandbox Code Playgroud)

但是我找不到将其反序列化回ActiveRecord的正确方法.最直接的方式:

JSON.parse(@json_string).collect {|item| Model.new.from_json(item)}
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

WARNING: Can't mass-assign protected attributes: id
Run Code Online (Sandbox Code Playgroud)

所以id变空了.我想过只使用OpenStruct代替ActiveRecord,但我相信有更好的方法.

Joh*_*n H 8

您可以从JSON实例化新对象,然后再分配id.可能最好为此创建自己的方法:

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
Run Code Online (Sandbox Code Playgroud)

或者只是覆盖from_json()方法.