Ruby on Rails + Active_Record:如何在结果中包含子计数?

时间:2011-09-01 03:11:03

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我想通过在文件夹模型中创建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魔术......但如果有更清洁的方法,我真的不想走那条路。

提示赞赏!

1 个答案:

答案 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执行相同的操作。