下面需要什么类型的关系,以及如何利用SailsjS / Waterline简化我的查找和更新查询?

在我的应用程序中,我具有列表(列表模型),项目(项目模型)和配置(供应模型)。该应用程序的目的是管理库存。因此,Items是离散的,也就是说,Items-collection中只能有一个相同Item(primaryKey设置在item.name上)。单个列表与项共享一对多关系-通过规定来替代。规定只是给定列表的[离散]项的详细信息。在这种情况下,只能使用List-Id和Item-Id(list.id + item.id === provision.compositePrimaryKey)来访问Provision。

我的问题是处理findupdate操作的复杂性。使用另一种方法,我在列表和项之间只有一个多对多关系(以项为主导),这会在列表更新时生成一个项,并使用List.find(...).populate('items')聚合项。这几乎是理想的,但我需要综合准备。现在(使用下面的模式),列表和配置之间存在相同的关系-列表更新和“填充”生成并聚合具有正确list.id的配置,但是我期望Sails / Waterline生成项目模型-实例,因为Provision包含item: { model: 'item' }属性。这是我目前的方法:

规定:

//api/models/Provision.js
module.exports = {
    schema: true,
    attributes: {
        ...
        list: { model: 'list' },
        item: { model: 'item' },
        quantity: { type: 'integer' },
        ...
    }
};


清单:

//api/models/List.js
module.exports = {
    schema: true,
    attributes: {
        ...
        items: { collection: 'provision', via: 'list' },
        ...
    }
};


项目:

//api/models/Item.js
module.exports = {
    schema: true,
    attributes: {
        ...
        name: { type: 'string', primaryKey: true }
        lists: { collection: 'provision', via: 'item' },
        inStock: { type: 'integer' },
        ...
    }
};


我想生成一个Provision-如果仅通过更新列表-并自动找到或创建一个离散的Item-并在List上执行find时将Provision-instance中的Item水化,因为每个List的配给将具有指向项目的model链接。

我该怎么做,还是应该采用更好的设计?

最佳答案

当前primaryKey必须为id,照看帆钩在actionUtil上的蓝图,即主键必须为id字段。所以你的Item.js应该是

module.exports = {
    schema: true,
    attributes: {
        ...
        // change it's column name if necessary fo your DB scheme
        id: { type: 'string', unique: true, primaryKey: true, columnName: 'name' }
        lists: { collection: 'provision', via: 'item' },
        inStock: { type: 'integer' },
        ...
    }
};

我不太了解您要采取什么方法。但是使用Lifescycle callbacks可能会有所帮助。例如,在您的语句I would like to generate a Provision -- if only through updating a list -- and have a discrete Item found or created automatically中,请使用满足您需要的beforeUpdatebeforeCreate等。

07-24 20:24
查看更多