Ruby on rails RubyonRails+;活动记录:如何在结果中包含子计数?
通过在文件夹模型中创建as_json方法,我了解了如何在to_json结果中包含子项Ruby on rails RubyonRails+;活动记录:如何在结果中包含子计数?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,通过在文件夹模型中创建as_json方法,我了解了如何在to_json结果中包含子项 def as_json(options={ }) super( options.merge( :include => { :children => { } } ) ) end 上面的代码给了我一个孩子的列表,但是我想要的是包含计
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返回的每个文件夹中。然而,这似乎不起作用
接下来,我开始考虑向文件夹模型添加一个方法,例如
def child_count
write_attribute(:child_count, children.size)
end
但看了之后,我意识到这不是真的有用
所以现在我正在研究:选择做一些sql魔术。。。但如果有更干净的方法,我真的不想走那条路
谢谢 只需添加一个
child\u count
方法,返回子项的数量,然后使用的选项作为\u json
:
def as_json(options = { })
super(options.merge(:methods => :child_count))
end
不过,如果选项中已经有:方法
,您可能需要更加小心地处理该合并
,您将覆盖它;这样做可能比直接合并更好:
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,您可以使用代替json的做几乎相同的事情好的,我找到了答案,但是我不能回答我自己的问题,因为我的声誉不到100。这是我博客上答案的链接…我刚刚发现了这一点。我试图回答我自己的问题,但我的代表太低,它不让我。谢谢,不过这正是我想出来的!哦,有一个问题。。。这只会将其添加到json中。我想我可以创建一个as_-xml方法来将其添加到xml中,但这不起作用。然而,我发现我可以使用xml来满足那些需要相同功能的人。@Altonymous:xml应该是相同的。我还为您可能感兴趣的merge
处理添加了一个“paranoia”更新,以防将来有人说x.as_json(:methods=>:aha!)
。