我有一个Ember应用程序,其中一些模型使用Ember数据,有些则不使用。我的问题涉及创建这些模型之间的关系,以及构建模型关系的最佳方式。
目前我有以下型号:
在我的应用中,我需要一个部分作为一个具有weight
字段的唯一记录。每个部分应从关联的Food
派生出其他值。膳食应包含许多部分。
Meal
上的一个字段(例如:portions
)吗?考虑到部分不可重复使用,只能与单个膳食相关联。 Meal
模型def会是什么样的?Food
不使用Ember Data,因此定义部分与食物之间关系的最佳技术是什么?最终用户体验应该允许某人
非常感谢您的帮助。
答案 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.Adapter和DS.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() {}
});