可能是一个愚蠢的问题,但我对Rails相对较新,并想知道Rails如何处理序列化另一个类的has_many(和/或belongs_to)对象的模型。它会默认序列化整个对象图吗?你一定想要吗?你能控制一下吗?怎么样?
接收端有关如何对其进行反序列化的任何技巧?或几乎蛮力为其哈希值分配属性,然后任何嵌入的数组/哈希将成为关联的类对象?
编辑:添加使用@ zetetic示例返回的json示例。想知道为什么嵌入式集合(索环)在每个引用(\
)之前都有转义("
)字符?
{"name":"Gizmo","height":15,"grommets":"[{\"name\":\"Sid\",\"color\":\"yellow\"},{\"name\":\"Elvis\",\"color\":\"\"},{\"name\":\"Teeny\",\"color\":\"Red\"}
答案 0 :(得分:3)
不,默认情况下,序列化模型实例仅发出自己的属性,而不是其关联的属性。但您可以通过在模型中包含as_json
方法来自定义此行为:
class MyModel < ActiveRecord::Base
has_many :widgets
def as_json(options={})
{
:name => name,
:widgets => widgets.to_json
}
end
end
您可能也想在相关模型中定义as_json
,否则您将获得属性的标准哈希值。
修改强>
原来上面的示例仅适用于顶级,而不适用于最终转义的关联。要使示例正常工作,请在as_json
中使用所需属性定义Widget
,然后在MyModel
调用as_json
集合的每个元素上定义:{/ p>
def as_json(options={})
{
:name => name,
:widgets => widgets.map(&:as_json)
}
end
我猜你可以monkeypatch Array#as_json,虽然我更喜欢使用map
。
修改
如果您正在考虑提出这个答案,请务必先阅读this one。使用:include
是首选方法。
答案 1 :(得分:1)
轻松! (在Rails 2.3.8上测试)
来自http://apidock.com/rails/ActiveRecord/Serialization/to_json
要包含关联,请使用:include
konata.to_json(:include => :posts)
# => {"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
{"id": 2, author_id: 1, "title": "So I was thinking"}]}
请参阅上面的链接了解更多信息。
对我来说,它甚至可以使用“:has_many,:through”关联。