用于复杂关联的 ActiveModel 序列化程序

ActiveModel Serializer for complicated associations

我有 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. 检查此 link。如果您希望您的关系保持递归呈现,则需要设置 ActiveModel::Serializer.config.default_includes = '**'(或在序列化对象时将其设置为您需要的任何值)。
  2. 不要将关系添加到 attributes(从 NotificationSerializer 中的 attributes 中删除 :recipient)。这可能有效,因为您的关系将覆盖该属性,但没有理由让他们打架。

编辑:由于设置 default_includes 似乎有问题,因此在渲染最终结果时需要一个特定的设置:

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