2015-07-28 3 views
1

У меня есть приложение на Parse.com, которое содержит 3 простых класса: User, Alpha и Beta.Удалять объекты в других классах при удалении объекта пользователя Parse.com

  • User класс заполняется, когда новые пользователи регистрируются для приложения.
  • Alpha класса заполняется, когда эти пользователи создают материал (загружать фотографии, звуки, видео и т.д.)
  • Beta класса заполняется, когда другие пользователи выполняют действия над объектами класса Alpha (доля, любимым, и т.д.).

Задача под рукой: Найти способ, чтобы удалить все объекты в Alpha и Beta классов для конкретного пользователя, когда они удаляются из User класса. Прямо сейчас, если пользователь удален, дочерние объекты в классах Alpha и Beta остаются в качестве объектов-сирот, а другие пользователи все еще могут видеть эти объекты. Это вызывает несоответствия в приложении.

С моим незначительным пониманием бэкэнда Parse, я думаю, что я должен использовать Cloud Code с Background Jobs (если я прав), но я не уверен, как это сделать.

ответ

1

До и после удаления крючок - это путь, немного более конкретный совет, относящийся к описанию приложения, предполагая, что объекты Alpha имеют указатель на __User, называемый «createdBy».

Я думаю, что хорошо привыкнуть использовать небольшие обещающие функции для выполнения асинхронных шагов. Что-то вроде следующего ...

Parse.Cloud.beforeDelete(Parse.User, function(request, response) { 
    var user = request.object; 
    deleteAlphasForUser(user).then(function(result) { 
     return deleteBetasForUser(user); 
    }).then(function(result) { 
     response.success(result); 
    }, function(error) { 
     response.error(error); 
    }); 
}); 

function deleteAlphasForUser(user) { 
    return alphasForUser(user).then(function(alphas) { 
     return Parse.Object.destroyAll(alphas); 
    }); 
} 

function alphasForUser(user) { 
    var query = new Parse.Query("Alpha"); 
    query.equalTo("createdBy", user); 
    return query.find(); 
} 

Я не снабжал deleteBetasForUser или функция, которая извлекает беты, но они должны быть очень похожи на функцию для классов Альфа.

1

CloudCode "afterDelete" triggers может быть хорошим вариантом. Таким образом, осиротевшие объекты могут быть очищены немедленно, имея существующую ссылку на пользователя, который удаляется. Ссылка выше включает в себя отличный пример очень похожего решения.

Parse.Cloud.afterDelete("Post", function(request) { 
    query = new Parse.Query("Comment"); 
    query.equalTo("post", request.object.id); 
    query.find({ 
    success: function(comments) { 
     Parse.Object.destroyAll(comments, { 
     success: function() {}, 
     error: function(error) { 
      console.error("Error deleting related comments " + error.code + ": " + error.message); 
     } 
     }); 
    }, 
    error: function(error) { 
     console.error("Error finding related comments " + error.code + ": " + error.message); 
    } 
    }); 
}); 

В то время как фоновая работа могла бы работать, он будет иметь тот недостаток, имеющий очистку задерживается до этого фонового задания не планируется. Кроме того, поскольку пользователь уже был удален, запрос и обработка потерянных объектов может быть немного неэффективна.

Смежные вопросы