【问题标题】:NodeJS|SailsJS|Waterline: Automatic Model Generation in One-To-Many--To--Many-To-Many RelationshipsNodeJS|SailsJS|Waterline:一对多-对-多对多关系中的自动模型生成
【发布时间】:2015-07-06 16:31:38
【问题描述】:

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

在我的应用程序中,我有 Lists (List-Model)、Items (Item-Model) 和 Provisions (Provision-Model)。该应用的目的是管理库存。因此,项目是离散的——这意味着,在项目集合中只能有一个相同的项目(primaryKey 设置在 item.name 上)。单个 List 与 Items 共享一对多的关系 -- vicariously 通过 Provisions。条款只是给定列表的 [离散] 项目的详细信息。在这种情况下,只能使用 List-Id 和 Item-Id 访问一个 Provision (list.id + item.id === provision.compositePrimaryKey)。

我的问题是处理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 -- 如果只是通过更新一个列表 -- 并且有一个离散的项目 自动 找到或创建 -- 并在执行时在 Provision-instance 中水合项目find 在列表中,因为每个列表的规定都将具有指向项目的 model 链接。

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

【问题讨论】:

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


    【解决方案1】:
    1. 目前primaryKey必须是id,看actionUtil的sails hooks蓝图主键还必须是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等满足你需要的。

    【讨论】:

    • 谢谢,安迪。这并不能完全满足我的需要,但它与我正在尝试的一种新方法融为一体。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多