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

时间:2015-06-24 18:56:28

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

我有用户,我有管理员,但管理员只是引用用户。在管理员中,我有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

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

1 个答案:

答案 0 :(得分:1)

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

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将收到一组用户,而不是管理员。