Я создаю сайт AngularJS CRUD для добавления данных на Parse.com для использования мобильными приложениями, которые его прочтут. (CRUD проще делать на реальной клавиатуре из-за количества добавленных данных.) Первый шаг - создать и сохранить дочерние объекты (ингредиенты и шаги), а затем создать и сохранить объект рецепта, который имеет отношение к Ингредиенты и этапы. Для этого мне нужно использовать Relation, а не указатели. (потому что мне может понадобиться, чтобы это было много для многих в будущем)
Здесь моя проблема: написать запрос, чтобы найти какие-либо ингредиенты и шаги, которые были созданы, которые еще не являются частью отношения, чтобы найти те, которые будут добавлены в новый рецепт.
Примеры в Javascript SDK не показывают этот сценарий, они показывают только запрос для отношения, которое существует, но не имеет дополнительного атрибута связанного элемента (комментарии для сообщений, в которых сообщение не имеет изображения).
Recipe has ingredients, a Relation<Ingredient>, and steps, a Relation<Step>.
Это не работает, чтобы получить ингредиенты, которые еще не связаны с рецептом.
var Recipe = Parse.Object.extend("Recipe");
var Ingr = Parse.Object.extend("Ingredient");
recipeQuery= new Parse.Query(Recipe);
recipeQuery.exists("ingredients");
query = new Parse.Query(Ingr);
query.doesNotMatchQuery("recipe",recipeQuery);
query.ascending('name');
query.find({
success: function (data) {
if (data.length > 0) {
$scope.loadingMsg = '';
}
$scope.ingredients = data;
}
});
angular
.module('app.services')
.service('siteService', function($q, ParseService, $timeout) {
var that = this;
this.fetchIngr = function() {
return this.fetchRecipes().then(function(recipes) {
var q = recipes.reduce(function(initial, current) {
initial.push(that.fetchIngredient(current));
return initial;
}, []);
return $q.all(q);
});
};
this.fetchRecipes = function() {
var defer = $q.defer();
var Recipe = Parse.Object.extend("Recipe");
recipeQuery = new Parse.Query(Recipe);
recipeQuery.ascending('name');
recipeQuery.find({
success: function(data) {
console.log('data', data)
defer.resolve(data);
},
error: function(error) {
defer.reject(error);
}
});
return defer.promise;
};
this.fetchIngredient = function(recipe) {
var defer = $q.defer();
recipe.relation('ingredients').query().find({
success: function(res) {
defer.resolve(res);
},
error: function(error) {
defer.reject(error);
}
});
return defer.promise;
};
})
Применение:
siteService.fetchIngr().then(function(all){
console.log('flatten all ingr for used recipes',[].concat.apply([], all));
});
в функции fetchIngr вы получите массив всех ингредиентов, которые используются в Рецепте. то вам нужно разграничить два массива, чтобы найти неиспользуемые ингредиенты. Чтобы сделать вычитание, вы должны получить все ингредиенты и сделать вычитание между двумя массивами (один из них использовался для рецептов и один со всеми ингредиентами). см. здесь сообщение: разность массивов JavaScript
если у вас есть вопросы, не стесняйтесь спрашивать меня.