下面需要什么类型的关系,以及如何利用SailsjS / Waterline简化我的查找和更新查询?
在我的应用程序中,我具有列表(列表模型),项目(项目模型)和配置(供应模型)。该应用程序的目的是管理库存。因此,Items是离散的,也就是说,Items-collection中只能有一个相同Item(primaryKey
设置在item.name
上)。单个列表与项共享一对多关系-通过规定来替代。规定只是给定列表的[离散]项的详细信息。在这种情况下,只能使用List-Id和Item-Id(list.id + item.id === provision.compositePrimaryKey
)来访问Provision。
我的问题是处理find
和update
操作的复杂性。使用另一种方法,我在列表和项之间只有一个多对多关系(以项为主导),这会在列表更新时生成一个项,并使用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
中,请使用满足您需要的beforeUpdate
,beforeCreate
等。