Sailsjs 在 beforeCreate 期间将一对多关联添加到模型
Sailsjs add one to many association to a model during beforeCreate
每当创建新用户时,我都会尝试提供从用户到宠物的默认关联。
型号:: User.js
var User = {
attributes: {
name: {type: 'string'},
// Add a One Way Relation to pet model
pets: {
collection: 'pet'
},
},
/*** This did not work ***/
beforeCreate: function (user, next) {
var defaultPet = {name: 'Default Pet 1'};
Pet.find(defaultPet).exec(function(err, pet) {
user.name = "BEFORECREATE",
user.pets = pet[0].id;
next();
});
},
}
module.exports = User;
但是,当创建新记录时,user.pet 为 [ ],但 user.name 更改为 "BEFORECREATE"。
如何为新创建的用户自动获取 user.pets = [{name: 'Default Pet 1'}]?
或者是否有更好的地方可以设置此类默认值?
----- 更新:更多信息
我目前正在使用 sails-disk。
型号:Pet.js
module.exports = {
attributes: {
name: {
type: 'string',
required: true
}
}
};
您不能在像 beforeCreate
这样的生命周期回调中向模型添加关联。目前,Waterline 在 before 生命周期回调 运行 之前查找并处理 "nested models",因此在调用 beforeCreate
时为时已晚。最简单的解决方案是创建一个 User.createUser
class 方法来包装您想要的逻辑:
createUser: function(data, cb) {
// If there are already pets specified, just use those
if (data.pets) {return User.create(data).exec(cb);}
// Otherwise look up the default pet
Pet.findOne({name:"Default Pet 1"}).exec(function(err,pet) {
// Return in case of error
if (err) {return cb(err);}
// Assuming the default pet exists, attach it
if (pet) {
console.log("SETTING DEFAULT PET", pet.id);
data.pets = [pet.id];
}
// Create the pet
return User.create(data).exec(cb);
});
}
一些注意事项:
- 在您的示例中,您将
pets
直接设置为一个 ID,但由于它是一个集合,您必须将其设置为一个数组。
- 如果您使用的是
sails-disk
适配器,则需要在您的模型中设置 schema: true
才能正常工作。
- 您取回的新
User
模型将 不会 填充;您必须使用新用户 ID 执行 find
和 populate('pets')
才能附加宠物数据。
每当创建新用户时,我都会尝试提供从用户到宠物的默认关联。
型号:: User.js
var User = {
attributes: {
name: {type: 'string'},
// Add a One Way Relation to pet model
pets: {
collection: 'pet'
},
},
/*** This did not work ***/
beforeCreate: function (user, next) {
var defaultPet = {name: 'Default Pet 1'};
Pet.find(defaultPet).exec(function(err, pet) {
user.name = "BEFORECREATE",
user.pets = pet[0].id;
next();
});
},
}
module.exports = User;
但是,当创建新记录时,user.pet 为 [ ],但 user.name 更改为 "BEFORECREATE"。
如何为新创建的用户自动获取 user.pets = [{name: 'Default Pet 1'}]?
或者是否有更好的地方可以设置此类默认值?
----- 更新:更多信息
我目前正在使用 sails-disk。
型号:Pet.js
module.exports = {
attributes: {
name: {
type: 'string',
required: true
}
}
};
您不能在像 beforeCreate
这样的生命周期回调中向模型添加关联。目前,Waterline 在 before 生命周期回调 运行 之前查找并处理 "nested models",因此在调用 beforeCreate
时为时已晚。最简单的解决方案是创建一个 User.createUser
class 方法来包装您想要的逻辑:
createUser: function(data, cb) {
// If there are already pets specified, just use those
if (data.pets) {return User.create(data).exec(cb);}
// Otherwise look up the default pet
Pet.findOne({name:"Default Pet 1"}).exec(function(err,pet) {
// Return in case of error
if (err) {return cb(err);}
// Assuming the default pet exists, attach it
if (pet) {
console.log("SETTING DEFAULT PET", pet.id);
data.pets = [pet.id];
}
// Create the pet
return User.create(data).exec(cb);
});
}
一些注意事项:
- 在您的示例中,您将
pets
直接设置为一个 ID,但由于它是一个集合,您必须将其设置为一个数组。 - 如果您使用的是
sails-disk
适配器,则需要在您的模型中设置schema: true
才能正常工作。 - 您取回的新
User
模型将 不会 填充;您必须使用新用户 ID 执行find
和populate('pets')
才能附加宠物数据。