Sails.js oneToOne指向oneToMany上的最后一个



sails.js和水线模型的设计奇迹。

我有一个"熊"模型和一个"位置"模型。他们持有一个一对多的关联("随着时间的推移,熊可以有多个位置")。

bear.js

module.exports = {
  attributes: {
    location: {
      collection: 'location',
      via: 'bear'
    }
  }
};

location.js

module.exports = {
  attributes: {
    timestamp: {
      type: 'datetime',
      required: true
    },
    bear: {
      model: 'bear'
    }
  }
};

我正试图建立一个"一对一"的关联来获取熊的最后位置(lastLocation),并想知道什么是最好的解决方案:

  • 试图覆盖bear上的ToJSON,获取最后一个位置(似乎不起作用,因为ToJSON几乎不同步,所以我不能让它等待异步find
  • 创建一个真正的oneToOne关系,并在位置上添加一个钩子AfterCreate来更新"lastLocation"关联
  • 是否覆盖在位置创建的蓝图
  • 重写蓝图添加熊
  • 还有其他想法吗

感谢=)

我想这就是你的答案?

创建一个真正的oneToOne关系,并在位置上添加一个钩子AfterCreate来更新"lastLocation"关联?

您应该在熊上创建一个名为lastLocation:{model:'location'}的附加属性,并在关联熊上创建每个位置后自动更新该属性。他们还有其他方法可以做到这一点,但如果最后一个位置是阅读量很大的东西,那么这可能是你最好的方法。

现在,这是一点基于意见的,因为在你的设计中肯定会有很多因素,但我认为你使用这种方法会很好。

以下是我最终得到的结果:

  • model/Bear.js-最后位置关联

     lastLocation: {
         model: 'location'
     }
    
  • model/Location.js-afterCreate挂钩

    afterCreate: function(insertedLocation, callback) {
        if(!insertedLocation.bear) {
            return callback();
        }
        Bear.findOneById(insertedLocation.bear, function(err, bear) {
            if(err) {
                return callback(err);
            }
            Location.findOneById(bear.lastLocation, function(err, oldLastLocation) {
                bear.lastLocation = insertedLocation.id;
                bear.save(function(err) {
                    return callback(err);
                });
            });
        });
    }
    

    if(!insertedLocation.bear)测试是的关键

  • 我在afterUpdate挂钩内重复了类似的代码

    afterUpdate: function(updatedLocation, callback) {
        if(!updatedLocation.bear) {
            return callback();
        }
        Bear.findOneById(updatedLocation.bear, function(err, bear) {
            if(err) {
                return callback(err);
            }
            Location.findOneById(bear.lastLocation, function(err, oldLastLocation) {
                bear.lastLocation = updatedLocation.id;
                bear.save(function(err) {
                    return callback(err);
                });
            });
        });
    }
    

添加一个测试,以防止每次更新lastLocation 时更新熊

  • 可以添加一些PublishUpdate()逻辑

相关内容

  • 没有找到相关文章

最新更新