gpt4 book ai didi

ruby-on-rails - 如何保持 has_many :through relationships when serializing to JSON and back in Rails 4. 0.3?

转载 作者:可可西里 更新时间:2023-11-01 11:04:12 26 4
gpt4 key购买 nike

如何转换为 JSON 并返回并保持关系?当我解包对象时它认为它们不存在!

irb(main):106:0* p = Post.last
=> #<Post ...
irb(main):107:0> p.tags
=> #<ActiveRecord::Associations::CollectionProxy [#<Tag id: 41, ...
irb(main):109:0* p.tags.count
=> 2 #### !!!!!!!!!!!!

irb(main):110:0> json = p.to_json
=> "{\"id\":113,\"title\":... }"
irb(main):111:0> p2 = Post.new( JSON.parse(json) )
=> #<Post id: 113, title: ...

irb(main):112:0> p2.tags
=> #<ActiveRecord::Associations::CollectionProxy []>
irb(main):113:0> p2.tags.count
=> 0 #### !!!!!!!!!!!!

这是模型

class Post < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :tags, :through => :taggings

有人建议但行不通

irb(main):206:0* Post.new.from_json p.to_json(include: :tags)
ActiveRecord::AssociationTypeMismatch: Tag(#60747984) expected, got Hash(#15487524)

最佳答案

我模拟了与您完全相同的场景并发现:

每当一个模型(Post)有一个has_many through关联时,然后在创建该模型的一个实例时,即Post传递一个Hash例如:Post.new( JSON.parse(json) )Post.new(id: 113) 似乎 Rails 对它们的处理方式不同,尽管它们指向同一条记录.

我按照下面给出的顺序运行了以下命令:

p = Post.last
p.tags
p.tags.count
json = p.to_json

p2 = Post.new( JSON.parse(json) )
p2.tags
p2.tags.count ## Gives incorrect count

p3 = Post.find(JSON.parse(json)["id"]) ### See notes below
p3.tags
p3.tags.count ## Gives the correct count

我没有直接使用 Hash 创建一个新的 Post 实例,而是使用从反序列化 json 获得的 id 从数据库中获取记录。在这种情况下,实例 p3 和实例 p2 指的是同一个 Post,但 Rails 对它们的解释不同。

关于ruby-on-rails - 如何保持 has_many :through relationships when serializing to JSON and back in Rails 4. 0.3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com