ruby-on-rails - 如何为多对多关系编写事件模型序列化器?

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

尝试为 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 模型中的 tagIdspostIds 属性重命名为 tags帖子

关于ruby-on-rails - 如何为多对多关系编写事件模型序列化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834520/

相关文章:

routes - 不使用路由的 Ember.js 中的状态?

javascript - 带有冒泡 Action 的 Ember 单元测试组件

ember.js - ember 组件内存泄漏

ruby-on-rails - 仅转换具有回形针样式的特定文件类型的图像

ruby-on-rails - 获取从周五开始的周列表

ember.js - 是否有一个 EmberJS 插件可以在 try/catch 中运行应用程序并在外部记录未处理的错误?

javascript - Ember 2,使用 Ember.run.debounce 调用路由中的函数

ember.js - 使用 Ember CLI 和 ES6 语法 `export default` 我如何知道导出是否是 Ember.Object

ruby-on-rails - 如何在网页中动态显示 ping 输出?

mysql - 在 Mac 上为 Ruby on Rails 设置本地 Web 服务器