sup*_*ken 4 ruby-on-rails ember.js active-model-serializers ember-cli
试图为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')
});
Run Code Online (Sandbox Code Playgroud)
tag.js
export default DS.Model.extend({
name: DS.attr('string'),
postIds: DS.hasMany('post')
});
Run Code Online (Sandbox Code Playgroud)
Rails和Active Record中的模型只是Post,Tag和Theme.主题加入帖子和标签.(即:发布has_many:标签,通过:: 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
Run Code Online (Sandbox Code Playgroud)
这在一个方向上起作用:搜索帖子也将获得所有标签.不能在另一个中工作,因为我在TagSerializer中没有has_many.但是,如果我在两个序列化程序中都放置了has_many,则会出现堆栈级别太深的错误.
所以我想我的问题是:与ActiveModel序列化器实现多对多关系的典型方法是什么?我似乎无法找到任何有关如何在Rails后端设置它的资源.任何帮助,将不胜感激.谢谢!
小智 5
您得到的"堆栈级别太深"错误,因为每个序列化程序递归嵌入另一个.
我首先要确保你includes在Rails控制器中使用:
# 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
Run Code Online (Sandbox Code Playgroud)
然后,在您的序列化程序中,只有在加载了关联时才告诉它有条件地包含标签/帖子:
# post serializer
def include_tags?
object.association(:tags).loaded?
end
# tag serializer
def include_posts?
object.association(:posts).loaded?
end
Run Code Online (Sandbox Code Playgroud)
在此之后,它应该只降级一级.
作为旁注,您可能希望将ember模型中的tagIds和postIds属性重命名为tags和posts.
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |