etspring
@etspring
Начитанное быдло

Как правильно использовать AMS в сложном json?

Доброго времени суток, рельсаны!
Возник вопрос использования ActiveModelSerializer в сложном json.
И так: ruby 2.4.1, rails 5.0.1
Имеется модель User, которая строит Partnership с другими юзерами и может быть как User, так и Partner.
class User < ApplicationRecord
  has_many :partnerships, dependent: :destroy
  has_many :partners, :through => :partnerships
  belongs_to :partnership, class_name: 'Partnership' ,foreign_key: 'partner_id', required: false
end


Модель Partnership
class Partnership < ApplicationRecord
  belongs_to :user, required: false
  belongs_to :partner, class_name: 'User', required: false
end


Partnership serializer
class PartnershipSerializer < ActiveModel::Serializer
  attributes :id, :user, :partner, :accepted

  def user
    user = object.user
    { id: user.id, full_name: user.full_name, foto: user.image}
  end

  def partner
    partner = object.partner
    { id: partner.id, full_name: partner.full_name, foto: partner.image}
  end  

end


Теперь непосредственно о "проблеме".
В контроллере пытаюсь в ответ на запрос отрендерить следующий json
render json: { 
        inbox: { 
          accepted: Partnership.where(partner_id: current_user.id, accepted: true),
          unaccepted: Partnership.where(partner_id: current_user.id, accepted: true))
        }
}

К сожалению сериализатор не подхватывается, те отдаются все поля Partnership, а не те, что указаны в сериализаторе.
Использование следующей конструкции тоже ничего не дает:
PartnershipSerializer.new(Partnership.where(partner_id: current_user.id, accepted: true))

Получаем: NoMethodError (undefined method `read_attribute_for_serialization' for #):


Рельсаны, куда копать?

Сделал через жопу, но думаю есть более элегантное решение
render json: { 
        inbox: { 
          accepted: ActiveModel::SerializableResource.new(@not_my.where(accepted: true)).as_json,
          unaccepted: ActiveModel::SerializableResource.new(@not_my.where(accepted: false)).as_json
        }}
  • Вопрос задан
  • 202 просмотра
Решения вопроса 1
Dem1
@Dem1 Куратор тега Ruby on Rails
Ruby on Rails developer
ActiveModelSerializers::SerializableResource.new(Partnership.where(partner_id: current_user.id, accepted: true), { each_serializer: PartnershipSerializer })
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы