我第一次使用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": "....."
}
]
}
因为简单地添加像我在模型中所做的那样的关联并没有帮助第三种关联。
任何帮助将不胜感激!
答案 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 ]
}
}
}
}
]
)