1

Я использую active_model_serializers gem в первый раз. Версия который я использую 0.10.2Рельсы 4 AMS с тремя вложенными моделями

У меня есть три модели с ассоциациями, как это:

class Song < ActiveRecord::Base 
    has_many :questions 
end 

class Question< ActiveRecord::Base 
    belongs_to :song 
    has_many :answers 
end 

class Answer< ActiveRecord::Base 
    belongs_to :question 
end 

Я сгенерированные три сериализаторов так:

class SongSerializer < ActiveModel::Serializer 
    attributes :id, :audio, :image 

    has_many :questions 
end 

class QuestionSerializer < ActiveModel::Serializer 
    attributes :id, :text 

    belongs_to :song 
    has_many :answers 
end 

class AnswerSerializer < ActiveModel::Serializer 
    attributes :id, :text 

    belongs_to :question 
end 

, но, к сожалению, мой JSON ответ не показывает мне ответы на вопрос, но песни и вопросы показываются.

после того, как некоторые прибегая к помощи я попытался добавить ActiveModelSerializers.config.default_includes = «**» или из документации, как это:

class Api::SongsController < ApplicationController 
    def index 
     songs = Song.all 

     render json: songs, include: '**' #or with '*' 
    end 
end 

, но это привело меня в стек уровня слишком глубокую ошибку

Итак, что мне делать, чтобы получить ответ json, выглядит так:

{ 
    "id": "1", 
    "audio": "...", 
    "image": "...", 
    "questions": [ 
    { 
     "id": "1", 
     "text": ".....", 
     "answers": [ 
     { 
      "id": "1", 
      "text": "...." 
     }, 
     { 
      "id": "2", 
      "text": "..." 
     } 
     ] 
    }, 
    { 
     "id": "2", 
     "text": "....." 
    } 
    ] 
} 

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

Любая помощь будет оценена!

ответ

0

Вы можете сделать это в вашем контроллере со следующей структурой

respond_with Song.all.as_json(
     only: [ :id, :audio, :image ], 
     include: [ 
     { 
      questions: { 
      only: [:id, :text], 
      include: { 
       anwers: { 
       only: [ :id, :text ] 
       } 
      } 
      } 
     } 
     ] 
    ) 
+2

Благодарим за отзыв. Да, я делал это раньше, но это обычай rails as_json method, он не имеет ничего общего с AMS. Я хотел узнать больше об AMS. – Santar

1

Итак, наконец, после того, как несколько больше поисков я нашел решение, которое работало. Я должен был добавить к моему контроллеру include с вложенными моделями.

class Api::SongsController < ApplicationController 
    def index 
     songs = Song.all 

     render json: songs, include: ['questions', 'questions.answers'] 
    end 
end 

И это сработало как очарование!