与Sails.js / Waterline中的组合外键关联

时间:2014-11-10 05:53:28

标签: sails.js waterline

我需要一个名为'Package'的模型,它可以有一个或多个不同类型的子节点。例如,包可以包含指南,以及表单和其他内容类型(其中一些将在以后添加)。来自不同表的这些内容项中的每一个可以在多个包中。所以我有以下架构:

Package table
=============
id
name
....

PackageContent table
=============
id
packageId
contentType
contentId

Guide table
=============
id
name
...

Form table
=============
id
name

如何在sails.js的Package.js模型文件中为我的包定义'content'关联?我无法在sails.js或Waterline中找到有关组合外键的任何信息。我希望找到类似的内容:

// models/Package.js
module.exports = {
  attributes = {
    name: 'text',

    ....

    content: {
      through: 'PackageContent',
      collection: contentType,
      via: 'contentId'
    }
  }
};

1 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题。我的解决方案是在中间模型中创建不同的外键,并将属性设置为'required:false'。在您的示例中,PackageContent表可能如下所示:

 //PackageContent.js
 module.exports={
    attributes={
        package:{
            model:'package',
        },
        guide:{
            model:'guide'
            require:false
        },
        form:{
            model:'form'
            require:false
        }
        //other attributes...
    }
}

为了避免重复的包+内容组合,您可能需要编写beforeValidate方法来检查重复。我不确定这是否是一个“好的设计”,但它解决了问题