序列化自定义属性

时间:2015-05-15 08:49:27

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

我正在为我的应用程序使用Active Model Serializer gem。现在我遇到这种情况,用户可以拥有一个只是媒体ID的头像。

我将头像信息保存到Redis中。因此,目前我在序列化JSON中显示头像的方法是:

类UserSerializer< ::加载ActiveModel串行     包括阿凡达

attributes :id,
           :name,
           :email,
           :role,
           :avatar

def avatar
    Medium.find(self.current_avatar)[0]
end

#has_one :avatar, serializer: AvatarSerializer

has_many :media, :comments

url :user

我查询Redis以了解数据库中要查找的媒介,然后使用:avatar键中的结果。

在代码中还有一行注释掉,这是我在https://github.com/rails-api/active_model_serializers/页面上找到的关于在序列化器内使用自定义序列化器的唯一方法。

所以要解决我的问题。现在:avatar就像它在数据库中一样,但是我希望它在我作为JSON提供之前被序列化。 在这种情况下我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要序列化头像类:

class Avatar
  def active_model_serializer
    AvatarSerializer
  end
end

然后你就这样使用:

class UserSerializer < ActiveModel::Serializer include Avatar

  attributes :id,
             :name,
             :email,
             :role,
             :avatar

  def avatar
    # Strange you query another object 
    avatar = Medium.find(object.current_avatar).first
    avatar.active_model_serializer.new(avatar, {}).to_json
  end

  has_many :media, :comments

  url :user
end

答案 1 :(得分:0)

根据文档,如果您需要自定义序列化程序,则只需添加:

render json: avatar, serializer: AvatarSerializer

或您的序列化器名称可以是以下文档:

https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/serializers.md#scope