尝试为 ember-cli 应用程序设置后端。以下是模型在 Ember 中的样子:
post.js
export default DS.Model.extend({
heading: DS.attr('string'),
content: DS.attr(''),
imageUrl: DS.attr('string'),
pageId: DS.belongsTo('page'),
tagIds: DS.hasMany('tag')
});
tag.js
export default DS.Model.extend({
name: DS.attr('string'),
postIds: DS.hasMany('post')
});
Rails 和 Active Record 中的模型就是 Post、Tag 和 Theme。主题结合了帖子和标签。 (即:发布 has_many :tags,通过: :themes)
这是我的序列化器的样子:
class PostSerializer < ActiveModel::Serializer
embed :ids, include: true
attributes :id, :heading, :content, :image_url
has_many :tags
end
class TagSerializer < ActiveModel::Serializer
embed :ids, include: true
attributes :id, :name
end
这在一个方向上有效:搜索帖子也将获得所有标签。在另一个中不起作用,因为我在 TagSerializer 中没有 has_many 。但是,如果我在两个序列化器中都放置 has_many ,则会出现堆栈级别太深错误。
所以我想我的问题是:使用 ActiveModel 序列化器实现多对多关系的典型方法是什么?我似乎找不到任何关于如何在 Rails 后端进行设置的资源。任何帮助,将不胜感激。谢谢!
最佳答案
您收到“堆栈级别太深”错误,因为每个序列化器都递归地嵌入另一个序列化器。
我首先要确保您在 Rails Controller 中使用 includes
:
# posts controller
def show
post = Post.includes(:tags).find_by id: params[:id]
render json: post
end
# tags controller
def show
tag = Tag.includes(:posts).find_by id: params[:id]
render json: post
end
然后,在序列化程序中,告诉它仅在关联已加载时有条件地包含标签/帖子:
# post serializer
def include_tags?
object.association(:tags).loaded?
end
# tag serializer
def include_posts?
object.association(:posts).loaded?
end
此后,它应该只会向下级联。
顺便说一句,您可能需要将 ember 模型中的 tagIds
和 postIds
属性重命名为 tags
和 帖子
。
关于ruby-on-rails - 如何为多对多关系编写事件模型序列化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834520/