我有以下模型:

#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不允许我这样做来建立人际关系。如何为关系添加多个模型?

最佳答案

听起来您实际上需要带数量字段的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但绑定(bind)到特定订单(这将解决具有相同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关系,则需要向模型中添加异步)。这意味着,如果您需要更改订单项,则只会影响一个订单;如果您需要更改lineItem的相关订单,则只需在lineItem模型上执行此操作即可。
{
    "Orders" :
        [
            {
                "id": 1,
                "customerId": 123456,
            },
            {
                "id": 2,
                "customerId": 123456,
            }
        ]
}

07-28 10:48