Rails active_model_serializer на полиморфной вложенной ассоциации - PullRequest
0 голосов
/ 18 октября 2018

после установки драгоценного камня, я пытался получить глубоко вложенные полиморфные связанные данные.

, но драгоценный камень просто отображал данные, связанные с уровнем 1.

сериализатор

class CommentsSerializer < ActiveModel::Serializer
  attributes :id, :title, :body, :user_id, :parent_id, :commentable_id, :commentable_type

  belongs_to :user
  belongs_to :commentable, :polymorphic => true
end

После некоторых исследований

на странице active_model_serializers github doc

я пробовал это решение, и оно тоже не работало

has_many :commentable

def commentable
  commentable = []
  object.commentable.each do |comment|
    commentable << { body: comment.body }
  end
end

пожалуйста, кто-нибудь может сэкономить совет по этому вопросу?

и для некоторых, что я должен использовать

ActiveModel::Serializer.config.default_includes = '**'

я уже пробовал этот конфиг тоже

Скриншотниже иллюстрируют этот случай

enter image description here

этот комментарий содержит много комментариев по комментариям, но только один из них.Я хотел бы сделать остальные комментарии этого комментария.

1 Ответ

0 голосов
/ 18 октября 2018

Вы должны правильно определить ваши сериализаторы и быть осторожными, чтобы не делать все рекурсивно.Я настроил эти 2 модели:

class Post < ApplicationRecord
  has_many :comments, as: :commentable
end

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

И эти сериализаторы:

class CommentSerializer < ActiveModel::Serializer
  attributes :id, :body

  belongs_to :commentable, serializer: CommentableSerializer
end

class CommentableSerializer < ActiveModel::Serializer
  attributes :id, :body

  has_many :comments, serializer: ShallowCommentSerializer
end

class ShallowCommentSerializer < ActiveModel::Serializer
  attributes :id, :body
end

Вам нужен еще один сериализатор для всех комментариев поста, чтобы комментарии не пытались отображатьсообщение, которое будет пытаться отобразить комментарии и т. д. *

Оставьте включенным параметр конфигурации

ActiveModel::Serializer.config.default_includes = '**'

.

Вызов http://localhost:3000/comments/1 приводит к:

{
  "id": 1,
  "body": "comment",
  "commentable": {
    "id": 1,
    "body": "post",
    "comments": [
      {
        "id": 1,
        "body": "comment"
      },
      {
        "id": 2,
        "body": "Reply comment"
      }
    ]
  }
}

что, я полагаю, является тем, чего вы пытались достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...