ruby-on-rails 序列化自订属性

h5qlskok  于 2022-12-05  发布在  Ruby
关注(0)|答案(2)|浏览(168)

我正在为我的应用程序使用Active Model Serializer gem。现在我有这样的情况,用户可以有一个头像,这只是一个媒介的ID。
我已经把头像信息保存到Redis中了。所以现在我在序列化JSON中显示头像的方法是:

class UserSerializer < ActiveModel::Serializer
    include Avatar

    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
  end

我查询Redis以了解要在数据库中查找什么介质,然后在:avatar键中使用结果。
在代码的下面还有一行注解掉了,这是我在https://github.com/rails-api/active_model_serializers/页面上找到的关于在序列化程序内部使用自定义序列化程序的唯一方法。
现在来谈谈我的问题。现在:avatar就像它在数据库中一样,但是我希望它在作为JSON提供之前被序列化。在这种情况下,我该怎么做呢?

slhcrj9b

slhcrj9b1#

您需要序列化头像类:

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
wb1gzix0

wb1gzix02#

根据文档,如果您需要自定义序列化程序,只需添加:
render json: avatar, serializer: AvatarSerializer
或者您的序列化程序的名称可以是什么,下面是这些文档:
https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/serializers.md#scope

相关问题