5

假设我有一个具有以下布局的 Rails 应用程序(从我的实际项目中简化了一点):

User
    has many Notes

Category
    has many Notes

Note
    belongs to User
    belongs to Category

笔记可以在以下位置获得:

/users/:user_id/notes.json
/categories/:category_id/notes.json

但不是:

/notes.json

整个系统中的注释太多,无法在一个请求中发送 - 唯一可行的方法是仅发送必要的注释(即属于用户或用户试图查看的类别的注释)。

使用 Ember Data 实现这一点的最佳方式是什么?

4

1 回答 1

5

我会说简单:

余烬模型

App.User = DS.Model.extend({
  name: DS.attr('string'),
  notes: DS.hasMany('App.Note')
});

App.Category = DS.Model.extend({
  name: DS.attr('string'),
  notes: DS.hasMany('App.Note')
});

App.Note = DS.Model.extend({
  text: DS.attr('string'),
  user: DS.belongsTo('App.User'),
  category: DS.belongsTo('App.Category'),
});

导轨控制器

class UsersController < ApplicationController
  def index
    render json: current_user.users.all, status: :ok
  end

  def show
    render json: current_user.users.find(params[:id]), status: :ok
  end
end

class CategoriesController < ApplicationController
  def index
    render json: current_user.categories.all, status: :ok
  end

  def show
    render json: current_user.categories.find(params[:id]), status: :ok
  end
end

class NotesController < ApplicationController
  def index
    render json: current_user.categories.notes.all, status: :ok
    # or
    #render json: current_user.users.notes.all, status: :ok
  end

  def show
    render json: current_user.categories.notes.find(params[:id]), status: :ok
    # or
    #render json: current_user.users.notes.find(params[:id]), status: :ok
  end
end

请注意:这些控制器是简化版本(索引可能会根据请求的 id 进行过滤,...)。您可以查看How to get parentRecord id with ember data以进行进一步讨论。

活动模型序列化器

class ApplicationSerializer < ActiveModel::Serializer
  embed :ids, include: true
end

class UserSerializer < ApplicationSerializer
  attributes :id, :name
  has_many :notes
end

class CategorySerializer < ApplicationSerializer
  attributes :id, :name
  has_many :notes
end

class NoteSerializer < ApplicationSerializer
  attributes :id, :text, :user_id, :category_id
end

include我们在此处包含侧载数据,但您可以通过将参数设置为falsein来避免它ApplicationSerializer


ember-data 将接收并缓存用户、类别和注释,并根据需要请求丢失的项目。

于 2012-07-20T05:52:31.963 回答