2016-08-10 22 views
0

我尽力去完成什么:来自同一个表parse.com更新云代码的其他对象

  • 用户可以保存到表中的位置,并把他们的主动/非活动。

表位置:

  • 用户(指针到用户)
  • 位置(地理)
  • 活性(布尔)

情景的:

  • 用户保存一个新的位置它会自动将该位置设置为 处于活动状态。其他人都应该被设置为无效。
  • 用户将保存的位置设置为有效,自动将所有其他位置 设置为无效。

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

完美的东西我把这个作为cloudcode beforeSave:

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中保存一个对象时,它会在再次保存hook之前调用解析云?

有什么我可以做这件事或是我的逻辑错了吗?

+0

@ cricket_007 typo :) – MichaelAngelo

+0

好的,所以这不起作用?您是否发送活动地点?如果没有,你可以设置一个时间戳,并使用后保存功能将最近的位置设置为活动 –

+0

@ cricket_007嗯,我真的不明白你在说什么..因为你仍然会在一个循环权 – MichaelAngelo

回答

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

所以当你保存“无效”位置beforeSave响应确定。如果您保存了一个新的活动位置,它将首先检查唯一活动位置(query.first)并将其设置为非活动状态(通过这种方式,它在beforeSave成功之前),然后保存新的活动位置。

相关问题