Ruby on rails 如何在Rails中使用额外属性反序列化JSON?
我使用自定义SQLRuby 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
#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