从 JSON 反序列化 ActiveRecord

发布于 2024-12-11 19:05:03 字数 463 浏览 0 评论 0原文

我想使用 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,但我确信有更好的方法。

I would like to save query result into redis using JSON serialization and query it back.

Getting query results to json is pretty easy:

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

However I did not find a proper way to deserialize it back to ActiveRecord. The most straight-forward way:

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

Gives me an error:

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

So id gets empty. I thought of just using OpenStruct for the views instead of ActiveRecord but I am sure there is a better way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜夜流光相皎洁 2024-12-18 19:05:03

您可以从 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() 方法。

You could instantiate the new object from JSON and then assign the id afterwards. Probably best to create your own method for this:

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

Or maybe just override the from_json() method.

冰雪之触 2024-12-18 19:05:03

为什么不这样做:

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

Why not like this:

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

If the host that created the JSON adds a JSON root you might have to use item[1] instead of item.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文