Rails 4 AMS有三个嵌套模型

时间:2016-08-21 20:49:31

标签: ruby-on-rails ruby ruby-on-rails-4 active-model-serializers

我第一次使用active_model_serializers gem。我正在使用的版本是0.10.2

我有三个模型,其中包含这样的关联:

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": "....."
    }
  ]
}

因为简单地添加像我在模型中所做的那样的关联并没有帮助第三种关联。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

所以最后经过一些搜索后我找到了解决方案。我不得不添加到我的控制器包括嵌套模型。

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

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

它就像一个魅力!

答案 1 :(得分:0)

您可以使用以下结构在控制器中执行此操作

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