从同一个表parse.com更新云代码中的其他对象

时间:2016-08-10 12:28:29

标签: parse-platform cloud-code

我尝试完成的任务:

  • 用户可以将位置保存到表中并将其置于活动/非活动状态。

表位置:

  • 用户(指向用户的指针)
  • location(geodata)
  • active(bool)

情景的:

  • 用户保存一个新位置,自动将该位置设置为 活性。其他都应该设置为非活动状态。
  • 用户将保存的位置自动设置为活动的所有其他位置 应该设置为非活动状态。

因此,在位置表的最后,用户可以拥有多个位置,但只有1个可以同时处于活动状态。 我认为这是cloudcode的完美之处

我把它放在cloudcode中就像之前一样保存:

Parse.Cloud.beforeSave("Location", function(request, response) {
    var query = new Parse.Query("Location");
    query.equalTo("user", request.object.get("user"));
    query.equalTo("active", true);
    query.find({
    success: function(results) {
      //get all objects in the table and set the active property to false
      for (var i = 0; i < results.length; i++) {
            var object = results[i];
             object.set('active',false);
             object.save();
      }
      response.success();
    },
    error: function(error) {
      response.error(error.message);
    }
  });
}
});

猜猜会发生什么......所有对象都设置为false,我想我知道为什么......因为当你在cloudcode中保存一个对象时,它会在再次保存钩子之前调用解析云吗?

我能做些什么或我的逻辑错了吗?

1 个答案:

答案 0 :(得分:1)

我建议这个解决方案:

Parse.Cloud.beforeSave("Location", function(request, response) {

   var location = request.object;
   if (location.get("active")){
        var query = new Parse.Query("Location");
        query.equalTo("user", request.object.get("user"));
        query.equalTo("active", true);

        query.first().then(function(result){
                results.set('active',false);
               results.save()
            .then(function(){
                response.success();
            });
         },function (error) {
            response.error(error.message);
         });
   } else {
        response.success();
   }
});

因此,当您保存“inActive”位置时,beforeSave响应就可以了。如果您保存一个新的活动位置,它将首先检查唯一的活动locaton(query.first)并将其设置为非活动状态(通过这种方式,它会在beforeSave成功之前),然后保存新的活动位置。