我想通过在文件夹模型中创建as_json方法来了解如何将子项包含在to_json结果中。
def as_json(options={ })
super(
options.merge(
:include => {
:children => { }
}
)
)
end
上面的代码给了我一个孩子的列表,但我想要的是包括计数而不是孩子列表。我也想把它过滤到只有“活跃”的孩子。
我似乎无法找到一种有效的方法。
我正在使用以下代码返回文件夹列表。
def index
@folders = Folder.all(:order => "Name")
respond_with(@folders) do |format|
format.jsonp { render :json => @folders, :callback => params[:callback] }
end
end
最后,我想确保计数在所有结果中回归,而不仅仅是json。 json是最重要的,但我确实想确保它也在其他人中。
我以为我可以使用.size将查询添加到查询后@folders返回的每个文件夹中。但是,这似乎不起作用......
接下来,我开始考虑向Folder模型中添加一个方法,例如......
def child_count
write_attribute(:child_count, children.size)
end
但看了之后我意识到这不会真的有用......
所以现在我正在研究:选择做一些sql魔术......但如果有更清洁的方法,我真的不想走那条路。
提示赞赏!
答案 0 :(得分:4)
只需添加一个返回子项数的child_count
方法,然后使用as_json
的{{3}}选项:
def as_json(options = { })
super(options.merge(:methods => :child_count))
end
您可能希望对merge
更加谨慎,但如果:methods
中已有options
,则会覆盖它;像这样的东西可能比直接合并更能为你服务:
def add_child_count(options)
options[:methods] = [ options[:methods], :child_count ].flatten.compact.uniq
options
end
def as_json(options = { })
super(add_child_count(options))
end
对于XML,您使用:methods
代替as_json
执行相同的操作。