2015-02-10 2 views
0

Я использую код облака Парса, чтобы написать метод, который будет возвращать, и массив, содержащий два вспомогательных массива. С массивом - массив команд, а другой - массив, содержащий массивы этих членов команды. С целью получения списка команд и членов их команд. Массивы будут переданы на передний конец iOS для отображения.Parse Cloud Code - Вложение нескольких запросов с реляционными данными

Мои данные в настоящее время структурированы так, что есть объект Team, который может иметь несколько пользователей, но пользователь может иметь только одну команду.

Вот моя функция облака, как она сейчас живет:

var arrayOfUsers = []; 
var arrayOfTeamMembers = []; 
var arrayOfTeams = []; 

Parse.Cloud.define("GetTopTeams", function(request, response) { 
    var query = new Parse.Query("Teams"); 
    arrayOfTeams = []; 
    arrayOfTeamMembers = []; 
    fullArray = []; 
    query.find().then(function(teams) { 
     //returns a raw list of teams 
     return teams; 
    }).then(function(teams) { 
     arrayOfUsers = []; 
     teams.forEach(function(team) { 
      //add team to subArray1 
      arrayOfTeams.push(team); 
      //searches for all users within the team 
      var memberQuery = new Parse.Query(Parse.User); 
      memberQuery.equalTo('team', team);   
      memberQuery.find().then(function(tMember) { 
       //adds the team member to initial array 
       arrayOfUsers.push(tMember); 
      }); 
     }).then(function(){ 
      //pushes the finished array to the team member array 
      return arrayOfTeamMembers.push(arrayOfUsers); 
     }).then(function() { 
      return arrayOfTeams; 
     }); 
    }).then(function() { 
     return response.success([arrayOfTeams, arrayOfTeamMembers]); 
    }); 
}); 

Я могу заполнить arrayOfTeams но получать arrayOfTeamMembers оказывается трудно. Есть ли лучший способ их вложить? Я пробовал обещания, но я не знаком с обещаниями Javascript. Я нашел похожие сообщения, но ни один из них не затрагивает проблему, с которой я сталкиваюсь. Какие-либо предложения?

ответ

1

Вы можете использовать Underscore. Он уже доступен в Cloud Code. Используя его, вам понадобится только один запрос. И вы могли бы написать что-то вроде этого:

var memberQuery = new Parse.Query(Parse.User); 
memberQuery.exists("team"); 
memberQuery.include("team"); 
memberQuery.find().done(function(users){ 
    var usersGroupedByTeam = _.groupBy(users, function(user) { 
     return user.get("team").id; 
    }); 
    var arrayOfTeams = _.chain(users) 
     .map(function(user) { return user.get("team"); }) 
     .uniq(function(team) { return team.id; }) 
     .value(); 
    response.success({ 
     arrayOfTeams: arrayOfTeams, 
     usersGroupedByTeam: usersGroupedByTeam 
    }); 
}).fail(function(error){ 
    //error handle 
    response.error(error.message); 
}); 

Предлагаю вам вернуть свой результат как объект, а не массив. В конечном итоге у вас будут команды (arrayOfTeams) и ваши пользователи, сгруппированные по команде (usersGroupedByTeam).

И для извлечения определенных пользователей команды вы будете использовать usersGroupedByTeam["A_TEAM_ID"].

ПРИМЕЧАНИЕ. Помните, что по умолчанию Parse.Query содержит только 100 записей. Вы можете изменить его с помощью Parse.limit, но не забывайте учитывать это.

+0

Спасибо, Оскар! Код, похоже, работает, за исключением того, что командаId, которая получает возврат, равна нулю. User.get («team») вернет отношение, но не фактический объект Team. Какие-либо предложения? –

+0

Dominic, когда вы используете 'memberQuery.include (« team »)' вы говорите Parse, чтобы принести полный объект (не только отношение, либо id). Поэтому этот код должен работать, поскольку у вас есть команда для ВСЕХ пользователей. Фактически, когда мы используем 'memberQuery.exists (« team »)', мы гарантируем, что будут запрашиваться только пользователи с командой. Поэтому нет причин для ошибки. –

+0

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