2014-01-02 3 views
1

Привет и спасибо, что нашли время ответить на мой вопрос.Проблема с добавлением записи с несколькими отношениями

У меня есть следующие модели:

App.Project = DS.Model.extend({ 
    name: DS.attr('string'), 
    project_teams: DS.hasMany('project_team'), 
}); 

App.ProjectTeam = DS.Model.extend({ 
    val: DS.attr('number'), 
    project: DS.belongsTo('project'), 
    team: DS.belongsTo('team') 
}); 

App.Team = DS.Model.extend({ 
    project_teams: DS.hasMany('project_team'), 
    name: DS.attr('string') 
}); 

ProjectTeam в основном связь между проектом и командой, и она имеет некоторые дополнительные метаданные. Проект может иметь несколько команд, работающих над ним через модель ProjectTeam.

У меня есть следующий код в моем ProjectController:

var project = store.createRecord('project', { 
       name: projectName 
      }); 

project.save().then(function(record){ 
       Ember.run.next(function(){ 
        for(var i = 0; i < valArr.length; i++){ 
         var retTeam; 
         store.find('team', teamIds[i]).then(function(team){ 
          Ember.run.next(function(){ 
           retTeam = team; 
           console.log(team); 
          }); 
         }); 

         console.log(record); 
         var project_team = store.createRecord('project_team', { 
          project: record, 
          val: valArr[i], 
          team: retTeam 
         }); 

         project_team.save().then(function(pt){ 
          Ember.run.next(function(){ 
           projectTeamIds.push(pt.get('id')); 

           if(i === sdeHeads.length){ 
            record.set('project_teams', projectTeamIds); 
            record.save(); 
           } 
          }); 
         }); 
         // 

        } 
       }); 

      }); 

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

Я могу добавить объекты проекта, и они сохраняются в БД. Также я могу добавить объект ProjectTeam, но они не связаны с командой или проектом. Я проверил JSON и эти поля (проект и команды) равны нулю:/

В основном это должно быть поток:

  • Создание объекта проекта
  • получить идентификатор проекта и добавить несколько ProjectTeam объектов

EDIT:

Другой подход, который я попробовал, который также не работал ..

var project = store.createRecord('project', { 
       name: projectName 
      }); 


      for(var i = 0; i < sdeHeads.length; i++){ 
       store.find('team', teamIds[i]).then(function(team){ 
        var project_team = store.createRecord('project_team', { 
         sde_effort: sdeEffort, 
         team: team 
        }); 

        project.get('project_teams').pushObject(project_team); 
       }); 
      } 

      project.save(); 

Другой подход состоял в том, чтобы создать объект проекта, вставить объект children и только затем сохранить его в db. Однако этот подход не сработал, так как теперь Project_Teams вообще не добавляются в db. Код в пределах store.find('team', teamIds[i]).then(function(team){ не выполняется вообще. Там либо должен быть более простой способ сделать это, либо у Ember все еще есть способ пойти .. Действительно расстраивает ..

Спасибо за вашу помощь!

ответ

1

Ну, здесь есть несколько проблем с асинхронными установками. Так что это петля, поэтому она будет идти от 3 до 9, не касаясь частей 99/99 *. 99 и 99 * будут выполняться, когда сервер вернет результаты и сохранит возвраты, но это не обязательно будет в порядке (99 * может выполнить до 99, а еще более захватывающее 99 из одной итерации цикла может выполняться до 99 из другого цикла (IE retTeam и записи будут выход синхронизации с тем, что вы думаете, будет работать.) Кроме того, вы бы иметь проблемы закрытия цикла valArr[i] всегда должна быть вне границ.

1. project.save().then(function(record){ 
    2. Ember.run.next(function(){ 
    3. for(var i = 0; i < valArr.length; i++){ 
     4. var retTeam; 
     5. store.find('team', teamIds[i]).then(
      99. function(team){ 
      99 Ember.run.next(function(){ 
      99  retTeam = team; 
      99  console.log(team); 
      99 }); 
     5. }); 

     6. console.log(record); 
     7. var project_team = store.createRecord('project_team', { 
     7  project: record, 
     7  val: valArr[i], 
     7  team: retTeam 
     7 }); 

     8. project_team.save().then(
      99* function(pt){ 
      99 Ember.run.next(function(){ 
      99  projectTeamIds.push(pt.get('id')); 

      99  if(i === sdeHeads.length){ 
      99  record.set('project_teams', projectTeamIds); 
      99  record.save(); 
      99  } 
       }); 
      }); 

     9. } 
     }); 

    }); 

Что-то, как это должно работать , Хотя я немного нерешительно причины есть множество переменных, я не знаю о: valArr, sdeHeads, teamIds, projectTeamIds ...

project.save().then(function(projectRecord){ 
    var teamHookerUpper = function(teamId, arrVal, idx){ 
    store.find('team', teamId).then(function(team){ 

     var project_team = store.createRecord('project_team', { 
      project: projectRecord, 
      val: arrVal, 
      team: team 
     }); 

     project_team.save().then(function(pt){ 
     projectTeamIds.push(pt.get('id')); 
     if(idx === sdeHeads.length){ 
      projectRecord.set('project_teams', projectTeamIds); 
      projectRecord.save(); 
     } 
     }); 

    }; 

    for(var i = 0; i < valArr.length; i++){ 
    teamHookerUpper(teamIds[i], valArr[i], i); 
    } 
}); 
+0

Я боюсь, что не так много изменилось. Теперь это то, что происходит: 1) Создается проект (без самого важного hasmany поля project_teams, который ожидается. 2) Команды извлекаются (путем создания операции Project_team).Пока что так хорошо 3) Теперь создаются Project_teams, поля для проекта и команды - все нулевые! :/После этого вызывается projectRecord.save(), но я не вижу ничего в запросе PUT, потому что он дает мне статус 204 (без содержимого) ... Есть ли другой способ обойти это? Человек, почему они сделали это настолько жестким и трудным в работе? – Dragan

+0

@ kingping2k Я отредактировал мой оригинальный вопрос с другим подходом, который тоже не удался! – Dragan

+0

проблема не была связана с ember, но поля объектов на пентоне не соответствовали тем, что были на бэкэнде. proect! = project_id. Спасибо, хотя я ценю вашу помощь! – Dragan

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