ruby-on-rails – 如何为多对多关系编写activemodel序列化程序?
发布时间:2020-12-17 02:54:26 所属栏目:百科 来源:网络整理
导读:试图为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 e
试图为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:标签,通过:: 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,:name end 这在一个方向上起作用:搜索帖子也将获得所有标签.不能在另一个中工作,因为我在TagSerializer中没有has_many.但是,如果我在两个序列化程序中都放置了has_many,则会出现堆栈级别太深的错误. 所以我想我的问题是:与ActiveModel序列化器实现多对多关系的典型方法是什么?我似乎无法找到任何有关如何在Rails后端设置它的资源.任何帮助,将不胜感激.谢谢! 解决方法
您得到的“堆栈级别太深”错误,因为每个序列化程序递归嵌入另一个.
我首先确保你在Rails控制器中使用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属性重命名为标签和帖子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |