2016-11-04 7 views
0

Я использую ActiveModelSerializer 0.10. У меня есть коллекция Account s, которую я хочу сериализовать. Есть ли способ установить определенный сериализатор для каждой модели в коллекции? Я хочу, чтобы мой контроллер возвращал что-то вроде этого:Активная модель Serializer с различным сериализатором для каждой модели

{"accounts": 
    [ 
    {"type":"Group","groupname":"A group","internal_info":"Sensitive info"}, 
    {"type":"User","first_name":"Bob","last_name":"Smith","internal_info":"Sensitive info"} 
    ] 
} 

Мой API разделен на две части: API-интерфейс пользователя и API-интерфейс администратора. Пользовательский API использует стандартные сериализаторы, которые ActiveModelSerializer находит автоматически. Что-то вроде этого

render json: @accounts 

вернется (обратите внимание, что конфиденциальная информация не включена):

{"accounts": 
    [ 
    {"type":"Group","groupname":"A group"}, 
    {"type":"User","first_name":"Bob","last_name":"Smith"} 
    ] 
} 

Администратор API использует пользовательские сериализаторы (они включают более подробную информацию, например internal_info). Как я могу отобразить такую ​​коллекцию в моем админ-API? Я знаю, что могу использовать

render json: @accounts, each_serializer: Admin::AccountSerializer 

, который прекрасно работает в большинстве случаев, но в данном случае у меня есть два типа Account с. Могу ли я как-то использовать Admin::Account::GroupSerializer для Group объектов в коллекции и Admin::Accounts::UserSerializer для User объектов в коллекции?

ответ

0

В итоге я использовал Admin::AccountSerializer и условия. Лучшие решения приветствуются.

class AccountSerializer < ActiveModel::Serializer 
    attribute :groupname, if: :a_group? 

    attribute :first_name, if: :a_user? 
    attribute :last_name, if: :a_user? 

    def a_group? 
    object.class == Group 
    end 

    def a_user? 
    object.class == User 
    end 
end