是否可以在序列化程序中重新定义 {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 将接收一组用户来迭代而不是管理员。
我有用户,也有管理员,但管理员只是引用了用户。在管理员中,我有 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 将接收一组用户来迭代而不是管理员。