Доброго времени суток, рельсаны!
Возник вопрос использования 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
Модель Partnershipclass Partnership < ApplicationRecord
belongs_to :user, required: false
belongs_to :partner, class_name: 'User', required: false
end
Partnership serializerclass 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
}}