Ruby on rails 如何在Rails中使用额外属性反序列化JSON?

Ruby on rails 如何在Rails中使用额外属性反序列化JSON?,ruby-on-rails,json,serialization,ruby-on-rails-4,Ruby On Rails,Json,Serialization,Ruby On Rails 4,我使用自定义SQL#find_by_SQL加载了一些模型,因为vanilla Rails关系太慢,并且模型自动具有额外的属性字段。连载效果很好。但是,当我反序列化时,它会抱怨存在未知属性。我在没有保护的情况下尝试了,但没有效果。如何反序列化模型并保留额外的属性 > Post.new(JSON.parse(json), without_protection: true) ActiveRecord::UnknownAttributeError: unknown attribute: usern

我使用自定义SQL
#find_by_SQL
加载了一些模型,因为vanilla Rails关系太慢,并且模型自动具有额外的属性字段。连载效果很好。但是,当我反序列化时,它会抱怨存在未知属性。我在没有保护的情况下尝试了
,但没有效果。如何反序列化模型并保留额外的属性

> Post.new(JSON.parse(json), without_protection: true)
ActiveRecord::UnknownAttributeError: unknown attribute: username
我试图添加
attr\u accessor
字段,这对反序列化模型有效,但对序列化无效

> p.username
=> nil
> p.read_attribute :username
=> "test30"
> p.to_json
=> "{\"id\":129,\"user_id\":32,\"title\":\"The weird...\",\"username\":null}"

Ruby 2.0.0,Rails 4.0.3。

好的,我尝试了attr\u writer,attr\u reader,方法中的虚拟字段,并找到了一个解决方法,但我仍然认为这不是最好的方法

在模型中:

attr_accessor :username
# override to_json
  def to_json
    hash = self.as_json
    hash.merge!( {"username" => self.read_attribute(:username), 
       ... other fields ...
      } )
    hash.to_json
  end
然而,这会导致像这样的胡说八道

> p = Post.loadFromDBviaFindBySQL.first
> p.username                                ### WTF?!
=> nil
> p.read_attribute :username
=> "starrychloe"
> json = p.to_json
=> "{\"id\":130,\"username\":\"starrychloe\" ... }"
> p1 = Post.new.from_json json
=> #<Post id: 130, ...>
> p1.username
=> "starrychloe"
> p1.read_attribute :username               ### WTF?!
=> nil

在您的模型中添加
attr\u accessor:username
难道还不够吗?是的!我就是这么做的,它工作了,然后回来更新这篇文章!如果你愿意,你可以得到答案。那么这就解决了吗?@Wukerplank不完全。我说得太快了。现在
p.username
起作用了,但是
p.read\u属性(:username)
不起作用
read\u属性
在我使用
find\u by\u sql
时起作用,但在我添加那些
attr\u访问器时不起作用。如果不为空,我使用
read\u属性
使用快速方法,如果不存在,则返回慢速关系。我想我现在可以直接测试属性,而不是使用
read\u attribute
。我需要能够在从JSON解析和从DB加载时读取值
p.username | | p.read_属性(:username)| | p.user.username
感觉不对。我想少了点什么。
post.username || post.read_attribute(:username) || post.user.username