序列化has_many关系的摘要

时间:2014-09-16 14:28:01

标签: ruby-on-rails active-model-serializers ruby-on-rails-4.1

如何包含关联对象的摘要而不是对象本身。例如,如果客户有has_many项目,我可以这样做:

class ClientSerializer < ActiveModel::Serializer
  attributes :id, :name
  has_many :projects
end

但这将返回所有相关项目。我更愿意带回一些项目,下载完整项目列表的URL,上次更新项目等等。

包含关联对象摘要的最佳方法是什么?

理想情况下,例如生成的JSON将如下所示:

 {
  "id": 10,
  "name": "My Client",
  "projects": {
    "count": 5,
    "updated_at": "2014-09-09T13:36:20.000-04:00",
    "url": "https://my.baseurl.com/clients/10/projects"
  }

2 个答案:

答案 0 :(得分:3)

我不确定这是否是最好的方法,但我让这个工作:

class ClientSerializer < ActiveModel::Serializer
  attributes :id, :name, :archive, :updated_at, :projects
  def projects
    collection = object.projects.to_a
    { count: collection.length,
      updated_at: collection.map(&:updated_at).max,
      url: projects_url }
  end
end

答案 1 :(得分:1)

您可以创建实例方法:

class ClientSerializer < ActiveModel::Serializer
  has_many :projects

  def project_count
    projects.size
  end
end