我有用户,我有管理员,但管理员只是引用用户。在管理员中,我有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
现在有可能吗?这是否有意义?
答案 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将收到一组用户,而不是管理员。