2011-09-01 106 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!)'。 –

相關問題