用于复杂关联的 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
两期:
- 检查此 link。如果您希望您的关系保持递归呈现,则需要设置
ActiveModel::Serializer.config.default_includes = '**'
(或在序列化对象时将其设置为您需要的任何值)。
- 不要将关系添加到
attributes
(从 NotificationSerializer
中的 attributes
中删除 :recipient
)。这可能有效,因为您的关系将覆盖该属性,但没有理由让他们打架。
编辑:由于设置 default_includes
似乎有问题,因此在渲染最终结果时需要一个特定的设置:
render json: user, include: ['notifications', 'notifications.recipient'], status: :ok
我有 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
两期:
- 检查此 link。如果您希望您的关系保持递归呈现,则需要设置
ActiveModel::Serializer.config.default_includes = '**'
(或在序列化对象时将其设置为您需要的任何值)。 - 不要将关系添加到
attributes
(从NotificationSerializer
中的attributes
中删除:recipient
)。这可能有效,因为您的关系将覆盖该属性,但没有理由让他们打架。
编辑:由于设置 default_includes
似乎有问题,因此在渲染最终结果时需要一个特定的设置:
render json: user, include: ['notifications', 'notifications.recipient'], status: :ok