【问题标题】:Sailsjs add one to many association to a model during beforeCreateSailsjs 在 beforeCreate 期间向模型添加一对多关联
【发布时间】:2015-01-15 19:54:13
【问题描述】:

每当创建新用户时,我都会尝试将用户与宠物的默认关联。

模型:: 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
    }
  }
};

【问题讨论】:

    标签: sails.js


    【解决方案1】:

    您不能在像 beforeCreate 这样的生命周期回调中向模型添加关联。目前,Waterline 会寻找并处理像这些 before 生命周期回调运行的“嵌套模型”,因此在调用 beforeCreate 时为时已晚。最简单的解决方案是创建一个 User.createUser 类方法来包装您想要的逻辑:

      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);
        });
      }
    

    一些注意事项:

    1. 在您的示例中,您将 pets 直接设置为一个 ID,但由于它是一个集合,您必须将其设置为一个数组。
    2. 如果您使用的是 sails-disk 适配器,则需要在模型中设置 schema: true 才能使其正常工作。
    3. 您返回的新 User 模型将不会被填充;您必须使用 find 和带有新用户 ID 的 populate('pets') 来获取附加的宠物数据。

    【讨论】:

    • 我个人在模型中添加了一个临时字段,将我需要的 id 放在那里,然后去 afterCreate 将临时字段的 id 放入集合中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多