小编典典

将虚拟属性添加到json输出

json

假设我有一个处理待办事项清单的应用程序。清单中已完成和未完成的项目。现在,我想向列表对象添加两个虚拟属性。列表中已完成和未完成项目的计数。我还需要将这些显示在json输出中。

我的模型中有两种方法可以提取未完成/已完成的项目:

def unfinished_items 
  self.items.where("status = ?", false) 
end

def finished_items 
  self.items.where("status = ?", true) 
end

那么,如何在json输出中获得这两种方法的计数?

我正在使用Rails 3.1


阅读 318

收藏
2020-07-27

共1个答案

小编典典

Rails中对象的序列化包括两个步骤:

  • 首先,as_json调用将对象转换为简化的Hash。
  • 然后,to_jsonas_json返回值上调用,以获取最终的JSON字符串。

通常,您希望to_json一个人呆着,因此您所要做的就是添加自己的as_json实现,如下所示:

def as_json(options = { })
  # just in case someone says as_json(nil) and bypasses
  # our default...
  super((options || { }).merge({
    :methods => [:finished_items, :unfinished_items]
  }))
end

您也可以这样:

def as_json(options = { })
  h = super(options)
  h[:finished]   = finished_items
  h[:unfinished] = unfinished_items
  h
end

如果要为方法支持的值使用不同的名称。

如果您关心XML和JSON,请参阅serializable_hash

2020-07-27