2011-09-01 65 views
3

我想通过在文件夹模型中创建一个as_json方法来将这些孩子包含在to_json结果中。Ruby on Rails + Active_Record:如何在结果中包含子计数?

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 

最后,我想确保count不是返回所有结果而只是json。 json是最重要的,但我确实希望确保它在其他人中也是如此。

我想我可以通过使用.size将查询后的@folders返回的每个文件夹添加到计数。然而,这似乎并没有工作...

接下来,我开始寻找到添加一个方法到文件夹模式,如...

def child_count 
    write_attribute(:child_count, children.size) 
end 

但看着它,我意识到这不是真的去工作...

所以,现在我正在调查:选择做一些SQL魔术......但我真的不希望去那条路线,如果有一个更清洁的方式。

提示赞赏!

+0

好吧我想出了答案,但我不能回答我自己的问题,因为我的声誉小于100.所以这里有一个链接到我的博客上的答案... – Altonymous

回答

4

只需添加一个child_count方法返回的儿童人数,然后使用as_json:methods选项:

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,你做几乎同样的事情,而不是to_xmlas_json

+0

我只是想通了。我试图回答我自己的问题,但我的代表太低,它不会让我。谢谢,虽然这正是我想到的! – Altonymous

+0

哦,只有一个问题......只会将它添加到JSON中。我想我可以创建一个as_xml方法来将它添加到xml中,但这不起作用。但是,我发现我可以使用to_xml来处理那些需要相同功能的应用程序。 – Altonymous

+0

@Altonymous:XML应该是相同的交易。我还为您可能感兴趣的'merge'处理添加了“偏执狂”更新,以防将来有人说'x.as_json(:methods =>:aha!)'。 –

相关问题