2015-06-24 2 views
0

У меня есть пользователи, и у меня есть администраторы, но администратор просто ссылается на пользователя. Внутри администратора у меня есть 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

Можно обезьяне пропатчить объект передается в сериализатор, например, так:

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 получит коллекцию пользователей перебрать вместо админы.

+1

Инициализировать() мне не пришло в голову. Я думаю, мне нравится вариант № 2, хотя. Я собираюсь подать вариант №1 под категорию «только потому, что вы можете что-то сделать, а это не значит, что вам нужно». – Dan