使用ActiveModel Serializer呈现对象的子集

时间:2014-10-06 19:19:33

标签: ruby-on-rails json serialization active-model-serializers

我在Rails项目中使用ActiveModel Serializers。

对象的默认序列化程序相当大,并且在API响应中嵌套对象会导致相当大的JSON对象。

有时候,我想嵌入一个对象,但只需要在JSON中出现一小部分对象的属性。

显然,我可以这样做:

render json: @user, serializer: SmallerUserSerializer

但这会导致大量重复。

是否有可以传递给序列化程序的选项,以便它只包含序列化程序属性的子集?例如:

class BlogSerializer # This is pseudocode. Does not actually work. has_one :user, only_show: [:user_id, :profile_url] end

3 个答案:

答案 0 :(得分:0)

创建方法并在用户对象上调用to_json。然后将该方法名称添加到属性列表中。该方法也可以称为用户。

class BlogSerializer
  attributes :id, :user

  def user
    object.user.to_json( only: [ :id, :profile_url ] )
  end
end

答案 1 :(得分:0)

使用active model serialzers gem

您的伪代码将成为以下简单的模块化代码:

class BlogSerializer < ActiveModel::Serializer
  attributes :user_id, :profile_url
end

指南:http://railscasts.com/episodes/409-active-model-serializers

答案 2 :(得分:0)

创建一个方法并在用户对象上调用to_json。然后将该方法名称添加到属性列表中。该方法也可以称为用户。

class BlogSerializer
  require 'json'
  attributes :id, :user

  def user
    JSON.parse "#{object.user.to_json( only: [ :id, :profile_url ] )}"
  end
end