2010-09-23 76 views
2

意外的行为,我有这样的轨to_json为include_root_in_json

class Parent < ActiveRecord::Base 
    :has_many :kids 
end 

class Kid < ActiveRecord::Base 
    :has_many :grandkids 
    :belongs_to :parent 
end 

一个模式,我可以生成JSON是这样的:

the_parent.to_json(:methods => [:kids]) 

=>{ “父”:{ “孩子”: {“kid”:{“name”=>“kid0” ....等等。正是我想要的。每个对象看起来都像一个带有单个键的散列 - 这是模型名称 - 值是一个属性散列。大。

但我遇到麻烦时,我尝试序列整棵树,就像这样:

the_parent.to_json(:include => { :kids => { :include => :grandkids } }) 

=>{ “父”:{ “孩子”:[{ “名”=>“kid0 “ ... 缺少”kids“数组中的模型名称。同样的事情发生在孙辈的下一级。我将解析这个地方,这将有助于确定对象名称(而不是依靠使用关系名称的约定)。该文件advertise here:

ActiveRecord::Base.include_root_in_json = true 

我发现它没有任何效果。我的猜测是,不同的行为与方法和:include选项之间的差异有关,但我无法使用:方法语法来获得我需要的嵌套,而且我不确定这样做是否可以工作如果它编译。

任何想法?谢谢你,丹

+0

我应该也提到过,我正在做一个渲染的背景下to_json电话:格式。 json => the_parent.to_json ... – danh 2010-09-23 04:20:46

+0

我确定有更好的答案,但作为解决方法,我在我的模型中重写to_json,如下所示:def to_json(args)super(:methods => [:kids])end – danh 2010-09-23 04:22:32

回答

1

作为一种变通方法,我重写to_json在我的模型是这样的:

def to_json(args) 
    super(:methods => [:kids]) 
end 
+0

这很有效,但如果您处理大量数据,则会导致性能不佳。 :包括更快! – Alexander 2012-03-22 00:25:53