Sails.js 通过模型设置创建唯一的多键索引

Sails.js 通过模型设置创建唯一的多键索引,sails.js,Sails.js,我使用的是Sails v1.1- 我根据这里的sails文档创建了一个多对多自定义模型关联- PetUser模型有两列pet和user,其中每列都是各自的id。我想创建一个唯一的多键索引,这意味着不能有两行具有相同的pet和user组合。这意味着第二次调用应成功,第三次调用应失败并出现唯一性错误: await PetUser.create({ user: 1, pet: 33 }); // should succeed await PetUser.create({ user: 1, pet: 4

我使用的是Sails v1.1-

我根据这里的sails文档创建了一个多对多自定义模型关联-

PetUser模型有两列pet和user,其中每列都是各自的id。我想创建一个唯一的多键索引,这意味着不能有两行具有相同的pet和user组合。这意味着第二次调用应成功,第三次调用应失败并出现唯一性错误:

await PetUser.create({ user: 1, pet: 33 }); // should succeed
await PetUser.create({ user: 1, pet: 44 }); // should succeed as user/pet combination is different
await PetUser.create({ user: 1, pet: 33 }); // should fail
我尝试在下面的PetUser模型中为所有者和宠物属性添加unique:true,但只有第一个unique:true得到尊重

这是我在myApp/api/models/PetUser.js中的代码


为了实现类似的行为,我添加了一个组合属性并将其标记为唯一。此外,我还添加了beforeCreate和beforeUpdate模型挂钩,在这些挂钩上生成组合属性以检查它是否唯一

const YourModel = {

  attributes: {
    owner: {
      model: 'user',
    },
    pet: {
      model: 'pet',
    },
    petOwner: {
      type: 'string',
      unique: true,
    }
  },

  beforeCreate : function(values,cb) {
    // TODO get ids from related records or reset to default on missed relation record if you need it
    const petId = 35;
    const ownerId = 8;
    values.petOwner = `${petId}-${ownerId}`;
    cb();
  },

  beforeUpdate : function(values,cb) {
    YourModel.beforeCreate(values, cb)
  },
};

module.exports = YourModel;

因此,当您尝试添加具有相同关系的记录时,您将获得您所期望的唯一性。

非常感谢Pavlo对我的问题的关注。这似乎是一个解决办法,如果我想不出来,我会用它。如果我弄明白了,我会和你分享或者你确定这是不可能的吗?@Noitidart我只想分享我的经验:我想这是一个解决办法。在半年前的有限时间内,我还没有为类似的任务找到更好的解决方案,因此这是我在Sails上的一个项目的产品。js:非常感谢@Pavlo您的经验非常宝贵。这肯定非常有帮助。如何处理多个addToCollection/removeFromCollection?我们必须一个接一个地创建PetUser,对吗?就像这里-@Noitidart坦率地说,我试图避免在水线的关系,但我真的喜欢它在拉雷维尔雄辩。当我尝试使用addToCollection时,我一次只对一条记录使用它。我还没有遇到过需要在real Projection上对多个记录执行此操作的情况,我不知道。为了弄清楚这一点,我通常会去找资料来源。我知道这是waterline,方法名是createEach,所以我需要在waterline包中找到createEach方法声明。当我打开node_modules/waterline时,我看到只有lib文件夹看起来合适。在里面我可以看到一个文件夹waterline,其中是子文件夹methods,我可以看到create-each.js。所以在检查完这个之后,我找到了line节点_modules/waterline/lib/waterline/methods/create each.js:292,在这里我可以看到这个查询运行的是一个算法,但有多个对适配器的调用。
const YourModel = {

  attributes: {
    owner: {
      model: 'user',
    },
    pet: {
      model: 'pet',
    },
    petOwner: {
      type: 'string',
      unique: true,
    }
  },

  beforeCreate : function(values,cb) {
    // TODO get ids from related records or reset to default on missed relation record if you need it
    const petId = 35;
    const ownerId = 8;
    values.petOwner = `${petId}-${ownerId}`;
    cb();
  },

  beforeUpdate : function(values,cb) {
    YourModel.beforeCreate(values, cb)
  },
};

module.exports = YourModel;