我有以下型号:
#order/model.coffee
Order = DS.Model.extend {
line_items: DS.hasMany 'product', {async: true}
}
在某些时候,我想将一些产品添加到订单中。我发现我只能添加一次产品,再添加相同的产品不起作用:
#product/route.coffee
...
actions:
# Not actually my code but illustrates the problem
addToCart: (product1, product2)->
order = @modelFor 'order'
console.log order.get('line_items.length') # prints 0
order.get('line_items').pushObject product1
console.log order.get('line_items.length') # prints 1
order.get('line_items').pushObject product2
console.log order.get('line_items.length') # prints 2
order.get('line_items').pushObject product1
console.log order.get('line_items.length') # prints 2
order.get('line_items').pushObject product2
console.log order.get('line_items.length') # prints 2
...
问题是用户可能不止一次需要单个项目。表示该方法的最简单方法是使数组具有重复条目。看来Ember并没有让我为关系这样做。如何在关系中多次添加模型?
答案 0 :(得分:4)
听起来你确实需要一个带有数量字段的line_items
模型。只是在orders
模型中推送更多同一项目并不是一个真正的标准化解决方案。
我会推荐以下内容:
lineItem = DS.Model.extend({
orders: DS.belongsTo('orders'),
product: DS.belongsTo('products'),
quantity: DS.attr('number'),
});
orders = DS.Model.extend({
lineItems: DS.hasMany('lineItem', {async: true}),
customerId: DS.belongsTo('customers'),
});
products = DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
cost: DS.attr('string'),
});
这将允许您在lineItem模型中创建多个记录,这些记录将具有唯一ID但绑定到特定订单(这将解决具有相同lineItem的多个订单的问题),例如,您可能具有:
{
"lineItem" :
[
{
"id": 1,
"orderId": 1,
"product": 1,
"quantity": 100,
},
{
"id": 2,
"orderId": 1,
"product": 2,
"quantity": 10,
},
{
"id": 3,
"orderId": 2,
"product": 1,
"quantity": 100,
}
]
}
在这个设计中,你将从你的json中删除对lineItems的引用,因为ember-data会为你提供反向关系(如果你不是sideloading你需要添加async的关系你的模特)。这意味着如果您需要更改订单项,它只会影响一个订单,如果您需要更改lineItem与您相关的订单,请在lineItem模型上执行此操作。
{
"Orders" :
[
{
"id": 1,
"customerId": 123456,
},
{
"id": 2,
"customerId": 123456,
}
]
}
答案 1 :(得分:1)
它们应该具有id
属性,然后它们将能够共存于同一个数组中并且是相同产品类型的不同项 - 具有相同的名称(除了{{之外的所有相同属性) 1}})。
或者,或者您有一条代表产品类型的记录,然后使用id
属性来指定每种产品的数量。