NodeJS | SailsJS |水线:一对多 - 多对多关系中的自动模型生成

时间:2015-07-06 16:31:38

标签: javascript database-design sails.js one-to-many waterline

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

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

我的问题是处理findupdate操作的复杂性。使用另一种方法,我在列表和项目之间只有一个多对多关系(以项目为主) - 这会生成一个列表更新项目和带有List.find(...).populate('items')的聚合项目。这几乎是理想的,但我需要混合中的规定。现在(使用下面的Schema),列表和规定之间存在相同的关系 - 列表更新和'填充'使用正确的list.id生成和聚合Provision,但我希望Sails / Waterline生成Item-Model-Instance,因为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' },
        ...
    }
};

我想生成一个配置 - 如果只是通过更新列表 - 并且找到或创建自动的离散项目 - 并在执行时在配置实例中保留一个项目列表中的find,因为每个列表的配置都会有一个model项链接。

我该怎么做,或者我应该采用哪种更好的设计?

1 个答案:

答案 0 :(得分:2)

  1. 目前primaryKey必须为id,请在actionUtil处查看sails挂钩蓝图主键必须为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' },
            ...
        }
    };
    
  2. 我不太明白你想要接近什么以及如何接近。但使用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等。