【问题标题】:How to write activemodel serializer for many to many relationship?如何为多对多关系编写activemodel序列化程序?
【发布时间】:2014-11-08 04:21:00
【问题描述】:

尝试为 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。主题加入 Post 和 Tag。 (即:发布 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 后端进行设置的资源。任何帮助,将不胜感激。谢谢!

【问题讨论】:

    标签: ruby-on-rails ember.js ember-cli active-model-serializers


    【解决方案1】:

    您收到“堆栈级别太深”错误,因为每个序列化程序都在递归嵌入另一个。

    我首先要确保您在 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 模型中的 tagIdspostIds 属性重命名为 tagsposts

    【讨论】:

    • 谢谢! tagIds 和 postIds 似乎是使用 ActiveModel 适配器的默认值
    • 嗨,克里斯,你能进一步解释一下代码的第二个 sn-p 吗?我不确定如何使用 include_tags?和include_posts?部分。
    • 当然。 ActiveModelSerializers 自动调用include_&lt;thing&gt;?(如果已定义)以确定属性或关联的 json 是否应在最终输出中。例如,如果当前用户是所有者或管理员,则有条件地显示属性也很有用。
    • 嗯,我刚试过这个,并通过 id 查找了一个帖子。 XHR 响应给了我一个带有标签的帖子作为一个空数组。看起来不错。
    猜你喜欢
    • 2016-08-09
    • 2021-07-19
    • 2019-07-29
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2019-09-06
    相关资源
    最近更新 更多