ActiveModel Serializer для сложных ассоциаций - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть 2 связанные модели:

class User < ActiveRecord::Base
    has_many :notifications, foreign_key: :recipient_id
end

class Notification < ActiveRecord::Base
    belongs_to :recipient, class_name: 'User'
    belongs_to :actor, class_name: 'User'
    belongs_to :notifiable, polymorphic: true
end

Я использую сериализатор для загрузки :user:

class API::UserSerializer < ActiveModel::Serializer
    attributes :id, :email, :auth_token, :location_id, :notifications

    has_many :notifications, foreign_key: :recipient_id, each_serializer: API::NotificationSerializer
end

, которая, в свою очередь, использует сериализатор для :notifications:

class API::NotificationSerializer < ActiveModel::Serializer
    attributes :id, :recipient_id, :actor_id, :notifiable_id, :read_at, :action, :recipient, :actor, :notifiable_type

    belongs_to :recipient, serializer: API::RecipientSerializer
    belongs_to :actor
    belongs_to :notifiable, polymorphic: true
end

Однако, API::RecipientSerializer никогда не используется, и вместо этого возвращается целое :recipient.Что я делаю не так?


Кроме того, вот API::RecipientSerializer для хорошей меры:

class API::RecipientSerializer < ActiveModel::Serializer
    attributes :id
end

1 Ответ

0 голосов
/ 29 ноября 2018

Два вопроса:

  1. Проверьте эту ссылку .Вам нужно установить ActiveModel::Serializer.config.default_includes = '**', если вы хотите, чтобы ваши отношения продолжали отображаться рекурсивно (или установите все, что вам нужно при сериализации объектов).
  2. Не добавляйте отношения к attributes (удалите :recipient изattributes in NotificationSerializer).Это может сработать, так как ваши отношения перезапишут атрибут, но нет причин заставлять их сражаться.

EDIT : поскольку, казалось, возникла проблема с установкой default_includes, при рендеринге конечного результата был нужен конкретный:

render json: user, include: ['notifications', 'notifications.recipient'], status: :ok
...