javascript - Ember 数据不允许 hasMany 关系中的重复条目

标签 javascript ember.js ember-data

我有以下模型:

#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 关系,则需要向模型添加异步)。这意味着如果您需要更改一个订单项,它只会影响一个订单,如果您需要更改一个订单项与您相关的订单,只需在订单项模型上执行此操作即可。

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

关于javascript - Ember 数据不允许 hasMany 关系中的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31150242/

相关文章:

ember.js - Ember-Data:了解 RecordArray 何时完全填充

javascript - 纸质对话是否有 "onOpen"事件?

ember.js - 使用 Store.pushPayload 预加载记录不会保留 hasMany 关系

javascript - 使用push函数将Json对象向上注入(inject)到VAR对象中

ember.js - TodoMVC - Ember.run.once

ember.js - 获取嵌套对象时在 hbs 中获取帮助程序

javascript - emberjs didRender 不工作

javascript - 如何根据另一个 Ember.Select 的选定选项通过计算属性填充 Ember.Select 选项

javascript - 如何使左/右箭头出现在悬停时?

javascript - 查看是否有文本输入