没有Ember数据的Ember关系

时间:2014-04-24 06:59:57

标签: ember.js ember-data relationship

我有一个Ember应用程序,其中一些模型使用Ember数据,有些则不使用。我的问题涉及创建这些模型之间的关系,以及构建模型关系的最佳方式。

模型

目前我有以下型号:

  • 食品
    • 使用Ember数据
    • 向外部API发出$ .ajax请求
    • 扩展Ember.Object(有关方法的示例,请参阅herehere
    • 使用Ember Data
    • 有很多部分
  • 部分
    • 使用Ember Data
    • hasOne Meal
    • hasOne Food

在我的应用中,我需要一个部分作为一个具有weight字段的唯一记录。每个部分应从关联的Food派生出其他值。膳食应包含许多部分。

问题

  1. 如果部分本身就是一个模型,我们应该将它存储在某种类似数组的结构中,作为Meal上的一个字段(例如:portions)吗?考虑到部分不可重复使用,只能与单个膳食相关联。
  2. 如果#1为“是”那么我的Meal模型def会是什么样的?
  3. 由于Food不使用Ember Data,因此定义部分与食物之间关系的最佳技术是什么?
  4. 最终用户体验应该允许某人

    1. 查看食物
    2. 创建该食物的一部分
    3. 将部分与膳食相关联
    4. 查看与膳食相关的所有部分
    5. 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Q1 :如果部分本身就是一个模型,我们应该将它存储在某种类似阵列的结构中作为膳食上的字段(例如:部分)吗?

我不确定您是问Portions应该是模型还是Portion应该是模型。但无论我认为解决方案是将Portion构建为模型并为portions模型构建Meal关系。因为你有功能来创造食物的一部分。根据我的理解,应该在没有用餐的情况下创建该部分(尽管它可以在以后与膳食相关联)。

Q2 :如果#1为“是”那么我的膳食模型def会是什么样的?

模型定义如下:

App.Portion = DS.Model.extend({
  weight: DS.attr(),
  meal: DS.belongsTo('meal', {async: true})
});

App.Meal = DS.Model.extend({
  portions: DS.hasMany('portion', {async: true})
});

Q3 :由于Food不使用Ember Data,这是定义部分和食物之间关系的最佳技术吗?

最好仍然使用Ember Data来定义Food模型,只需定义自定义适配器和序列化器,Ember Data处理其余部分。 DS.AdapterDS.Serializer文档是开始的好地方。下面是一个简单的例子。

// Just name it "FoodAdapter" and Ember Data knows to use it for "Food".
App.FoodAdapter = DS.Adapter.extend({
  find: function(store, type, id) {
    // The returned value is passed to "serializer.extract" then "store.push"
    return this._ajax({url: '/external/food', type: 'GET'});
  },

  createRecord: function() {},
  updateRecord: function() {},
  deleteRecord: function() {},
  findAll: function() {},
  findQuery: function() {},

  _ajax: function(options) {
    // Transform jQuery promise to standard promise
    return Em.RSVP.cast($.ajax(options));
  }
});

App.FoodSerializer = DS.Serializer.extend({
  // Assume the json is:
  // {
  //   "food_data": {
  //     "name": "XXX",
  //     "price": 100
  //   }
  // }
  extract: function(store, type, payload, id, requestType) {
    return payload.food_data;
  },

  serialize: function() {}
});