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,但我相信有更好的方法.
您可以从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()方法.