2011-10-24 54 views
1

我想使用JSON序列化将查询结果保存到redis中并进行查询。从JSON反序列化ActiveRecord

获取查询结果以JSON是很简单:

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

但是我没有找到反序列化回ActiveRecord的一种合适的方式。最直接的方法:

给我一个错误:

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

所以ID获取空。我想为OpenStruct代替ActiveRecord使用OpenStruct,但我确信有更好的方法。

回答

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 

或者,也许只是覆盖from_json()方法。

+1

虽然我很惊讶,但没有内置的支持。这听起来不错。谢谢 – mbdev

+1

只是站起来,我就是这样。如果你希望ActiveRecord认识到它不是数据库中的新对象,你可能想使用'allocate'而不是'new' –

1

为什么不喜欢这样的:

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

+0

json项目首先来自数据库。使用model.create将尝试在数据库中创建项目,并且将失败,因为项目已经存在。 – mbdev