首页 文章

没有Ember数据的灰烬关系

提问于
浏览
0

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

型号

目前我有以下型号:

  • 食物

  • 不使用Ember数据

  • 向外部API发出$ .ajax请求

  • 扩展 Ember.Object (有关方法的示例,请参阅herehere

  • 使用Ember数据

  • 有很多部分

  • 部分

  • 使用Ember数据

  • hasOne Meal

  • hasOne Food

在我的应用程序中,我需要一个部分作为一个具有 weight 字段的唯一记录 . 每个部分都应从相关的 Food 中获取其他值 . 膳食应包含许多部分 .

问题

  • 如果部分本身就是一个模型我们应该将它存储在某种类似于数组的结构中作为 Meal 上的字段(例如: portions )吗?考虑到部分不可重复使用,只能与单个膳食相关联 .

  • 如果"Yes"到#1那么我的 Meal 模型def会是什么样子?

  • 由于 Food 不使用Ember Data什么是定义部分和食物之间关系的最佳技术?

最终用户体验应该允许某人

  • 查看食物

  • 创建该食物的一部分

  • 将部分与膳食相关联

  • 查看与膳食相关的所有部分

非常感谢您的帮助 .

1 回答

  • 0

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

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

    Q2 :如果"Yes"到#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() {}
    });
    

相关问题