Можно ли переопределить {object} в сериализаторе?

У меня есть пользователи и администраторы, но администратор просто ссылается на пользователя. Внутри администратора у меня есть admin_roles, и у каждой admin_role есть много администраторов. В моем AdminRoleSerializer у меня есть has_many admins, которые сериализуются в 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

Возможно ли что-то подобное сейчас? Есть ли в этом смысл?


person Dan    schedule 24.06.2015    source источник


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

person Eli Duke    schedule 24.06.2015
comment
Initialize() не приходило мне в голову. Хотя вариант №2 мне больше нравится. Я занесу вариант №1 в категорию только потому, что вы можете что-то сделать, но это не значит, что вы должны это делать. - person Dan; 24.06.2015