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

Sails.js oneToOne pointing to last on oneToMany

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

我有一个 "bear" 模型和一个 "location" 模型。他们拥有 oneToMany 关联 ("bear can have multiple location over time")。

bear.js

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

location.js

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

我正在尝试创建一个 "oneToOne" 关联来获取熊的最后位置 (lastLocation),并想知道最佳解决方案是什么:

谢谢=)

我想这就是你的答案?

Creating a real oneToOne relationship and adding a hook AfterCreate on location to update that "lastLocation" association ?

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

现在这是一些基于意见的观点,因为您的设计中肯定会涉及许多因素,但我认为您可以使用这种方法。

这是我最终得到的:

  • 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 时都更新 bear

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