Ruby on rails 从JSON反序列化ActiveRecord

Ruby on rails 从JSON反序列化ActiveRecord,ruby-on-rails,json,deserialization,mass-assignment,Ruby On Rails,Json,Deserialization,Mass Assignment,我想使用JSON序列化将查询结果保存到redis中,然后再查询回来 将查询结果获取到json非常简单: JSON.generate(Model.all.collect {|item| item.attributes}) 然而,我没有找到一个合适的方法将其反序列化回ActiveRecord。最直接的方法是: JSON.parse(@json_string).collect {|item| Model.new.from_json(item)} 给我一个错误: WARNING: Can't mas

我想使用JSON序列化将查询结果保存到redis中,然后再查询回来

将查询结果获取到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,但我确信有更好的方法。

为什么不这样做:

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

为什么不这样做:

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

,您可以从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

或者只需重写来自json()的
方法。

您可以从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

或者可能只是重写
from_json()
方法。

json项首先来自数据库。使用model.create将尝试在数据库中创建该项,但将失败,因为该项已存在。json项首先来自数据库。使用model.create将尝试在数据库中创建该项,但将失败,因为该项已存在。尽管我感到惊讶,但该项没有内置支持。这听起来不错。谢天谢地,抬起头来,我正在做这个。如果您想让ActiveRecord意识到它不是数据库中的新对象,那么您可能需要使用
allocate
而不是
new
,尽管我很惊讶,它没有内置的支持。这听起来不错。谢天谢地,抬起头来,我正在做这个。如果希望ActiveRecord意识到它不是数据库中的新对象,则可能需要使用
allocate
而不是
new