Ember Data不允许在hasMany关系中存在重复条目

Ember Data does not allow duplicate entries in hasMany relationships

本文关键字:存在 关系 Data 不允许 hasMany Ember      更新时间:2023-09-26

我有以下模型:

#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,但绑定到特定订单,(这将解决多个订单具有相同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数据会为您处理反向关系(如果您不侧加载关系,则需要将async添加到模型中)。这意味着,如果您需要更改行项目,它将只影响一个订单,而如果您需要改变与行项目相关的订单,您只需在行项目模型上执行此操作。

{
    "Orders" : 
        [
            {
                "id": 1,
                "customerId": 123456,
            },
            {
                "id": 2,
                "customerId": 123456,
            }
        ]
}

它们应该具有id属性,然后它们将能够共存于同一阵列中,并且是相同产品类型的不同项-具有相同的名称(除id之外的所有相同属性)。

或者,您有一个代表产品类型的记录,然后有一个quantity属性来指定每个产品的数量。。