是否可以在序列化程序中重新定义 {object}?

Is it possible to redefine {object} within a serializer?

我有用户,也有管理员,但管理员只是引用了用户。在管理员中,我有 admin_roles,每个 admin_role 有很多管理员。在我的 AdminRoleSerializer 中,我有一个 has_many 管理员,它被序列化到 AdminRoleUserSerializer 中,如下所示:

module Admin
  class AdminRoleUserSerializer < ActiveModel::Serializer

    attributes :user_id, :first_name, :last_name, :title, :organization_name

    def user_id
      object.user.id
    end

    def first_name
      object.user.first_name
    end

    def last_name
      object.user.last_name
    end

    def title
      object.user.title
    end

    def organization_name
      object.user.organization_name
    end

  end
end

所以我将一组管理员传递到 AdminRoleUserSerializer 中,然后遍历每个管理对象以提取实际的用户信息,而且一点也不枯燥。将管理员传递给该序列化程序是最有意义的,但是必须像那样重新定义用户的每个属性是没有意义的。这是一个想法:

module Admin
  class AdminRoleUserSerializer < ActiveModel::Serializer

    object = object.user
    attributes :id, :first_name, :last_name, :title, :organization_name

  end
end

现在有可能吗?这有意义吗?

可以对传递给序列化程序的对象进行猴子修补,如下所示:

module Admin
  class AdminRoleUserSerializer < ActiveModel::Serializer

    def initialize(object, scope)
      super
      @object = object.user
    end

    attributes :id, :first_name, :last_name, :title, :organization_name

  end
end

这会将每个管理员更改为一个用户,然后您可以简单地设置您想要的用户属性列表。可以用,就是有点笨拙

您最好只更改传递给 AdminRoleUserSerializer 的内容。在 AdminRoleSerializer 中,您可以将管理员映射到用户集合,而不是将管理员集合传递给 AdminRoleUserSerializer:

object.admins.map(&:user)

现在您的 AdminRoleUserSerializer 将接收一组用户来迭代而不是管理员。