Active Model Serializer с разными сериализаторами для каждой модели

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

{"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 объектов в коллекции?


person ehannes    schedule 04.11.2016    source источник


Ответы (1)


В итоге я использовал 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
person ehannes    schedule 04.11.2016