当前位置: 首页 > 面试题库 >

将虚拟属性添加到json输出

蓬野
2023-03-14
问题内容

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

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

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

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

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

我正在使用Rails 3.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



 类似资料:
  • 有一个用户集合

  • 了解virtual属性 virtual是虚拟属性的意思,即原来Schema定义里是不存该属性,后来通过virtual方法赋予的属性。可以这样理解,Schema定义的属性是要保存到数据库里,而virtual属性基于已有属性做的二次定义,这样可以提供更好的语义上的处理。 模型属性 = Schema定义的属性 + virtual属性 下面举几个例子 实例1 需求是根据手机号和邀请码来判断该用户是否是有

  • 我想在gradle.properties文件中添加ndk.abifilters属性。现在我有了这栋楼里的房子。这是我建筑的一部分 这是我的gradle.properties文件的一部分

  • 问题内容: 如何添加到特定内容?不起作用。 问题答案: jQuery <1.9 jQuery 1.9以上

  • 问题内容: 考虑以下代码示例: 从PHP 5.3开始,这将产生(类似)以下输出: 但是下面的代码: …仅发出错误: 为什么将这些属性“添加”到对象?请注意,它们没有定义为手册页DateTime`上的类的一部分。 问题答案: 发生了一些魔术,但这很简单。 DateTime类没有您要访问的公共变量“date”。但是,作为PHP工作方式的副作用,在该类上调用print_r或var_dump时会创建一个变