2013-12-21 2 views
12

서버에 딥 객체를 한꺼번에 저장해야하며 최신 엠버 데이터 (1.0.0-beta.4)를 사용하는 온라인 예제를 찾을 수 없었습니다. 이 모델 예를 들어 Ember 데이터 : 관계 저장

: ( jsfiddle)

App.Child = DS.Model.extend({ 
    name: DS.attr('string'), 
    age: DS.attr('number'), 
    toys: DS.hasMany('toy', {async:true, embedded:'always'}), 
}); 
App.Toy = DS.Model.extend({ 
    name: DS.attr('string'), 
    child: DS.belongsTo('child') 
}); 

그리고이 코드 :

actions: { 
    save: function(){ 
     var store = this.get('store'), 
      child, toy; 

     child = store.createRecord('child', { 
      name: 'Herbert' 
     }); 
     toy = store.createRecord('toy', { 
      name: 'Kazoo' 
     }); 

     child.set('toys', [toy]); 
     child.save(); 
    } 
} 

그것은 단지 자식 개체에 대한 JSON을 절약 할 수 있지만 장난감의 - 옆쪽에로드되지 않음 :

{ 
    child: { 
    age: null 
    name: "Herbert" 
    } 
} 

수동으로 장난감을 저장해야합니까? 그렇지? , http://jsfiddle.net/jgillick/LNXyp/2/

답변

0

같아야합니다

{ 
    child: { 
    name: "Herbert", 
    toys: [ 
     { 
     name: 'Kazoo' 
     } 
    ] 
    } 
} 
: 당신이 child.serialize()를 호출 할 때
DS.JSONSerializer.reopen({ 
    serializeHasMany: function(record, json, relationship) { 
     var key = relationship.key, 
      property = Ember.get(record, key), 
      relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship); 

     if (property && relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || 
      relationshipType === 'manyToOne') { 

      // Add each serialized nested object 
      json[key] = []; 
      property.forEach(function(item, index){ 
       json[key].push(item.serialize()); 
      }); 
     } 
    } 
}); 

자,이 객체를 반환합니다

내가 원하는 것은 무엇입니까. 작동중인 jsfiddle이 있습니다. http://jsfiddle.net/jgillick/LNXyp/8/

+0

Ember 1.3.1/data 1.0.0-beta 6을 사용하면'property = Ember.get (record, key)'는 빈 약속 배열을 반환합니다. 'record.get ('key'), then (function (items) {...})'을 사용하여 하위 레코드에 액세스 할 수 있으므로 특히 이상합니다. 이것이 알려진 이슈라면 어떤 생각입니까? – eriknelson

3

장난감 비동기 항상 내장을 모두 할 수 없습니다

{ 
    child: { 
    age: null 
    name: "Herbert", 
    toys: [{ 
     name: "Kazoo" 
    }] 
    } 
} 

또는

{ 
    child: { 
    age: null 
    name: "Herbert", 
    toys: [1] 
    } 
} 

참조 JSFiddle을 : 나는 그것을 서버에 다음과 같은 JSON을 보낼 수 있습니다 어쨌든 있나요 그것들은 모순되는 선택이다. Embedded는 현재 활성 모델 직렬 변환기에만 있습니다.

toys: DS.hasMany('toy', {embedded:'always'}) 

장난감은 ManyToOne 관계, 그리고 관계가 belongsTo를 측면에 존재하기 때문에 그것의 저장 장난감 동안 관계를 저장하는 것이 더 효율적입니다. 즉, 모든 것을 한꺼번에 만들면 재정의 문제가되는 하나의 큰 덩어리에 저장하려고합니다.

serializeHasMany: function(record, json, relationship) { 
    var key = relationship.key; 

    var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship); 

    if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || 
     relationshipType === 'manyToOne') { 
    json[key] = get(record, key).mapBy('id'); 
    // TODO support for polymorphic manyToNone and manyToMany relationships 
    } 
}, 

그리고 당신의 저장 내가 깊은 개체, 대신 측면로드, 그래서 하나를 kingpin2k의 답변에 따라, 나는이 함께했다 필요한이

var store = this.get('store'), 
     child, toy; 

    child = store.createRecord('child', { 
     name: 'Herbert' 
    }); 
    toy = store.createRecord('toy', { 
     name: 'Kazoo' 
    }); 

    child.get('toys').pushObject(toy); 
    child.save().then(function(){ 
     toy.save(); 
    }, 
    function(err){ 
     alert('error', err); 
    }); 
+0

'장난감'은 어디에 정의되어 있습니까? 'toys.save()' 'child.get ('장난감'). save()'를 사용하거나 약속의 응답에 액세스하려면 각 호출에 save call 무관 심한 모델을 만들거나 한 번에 모두 구할 수 있습니까? 나는 Jeremy와 같은 문제가있다. 그리고 hasMany 속성을 디버깅/검사하려고 할 때,이 경우에는 child.get ('장난감')을 보게된다. 단지 새로운 레코드를 푸시 한 후에도 배열의 값이있다. 널입니다. 나는 Ember-Data가 장난감 배열에 장난감의 ID를 저장하는 것을 알고 있었기 때문에 이것을 가정했지만 장난감은 저장되지 않았기 때문에 아직 ID가 없습니다. –

+0

네, 그 장난감은'장난감'이어야합니다. 나는 개인 장난감을 저장하고있었습니다. – Kingpin2k

+0

그래서 이것을 올바르게 이해하면. 우리는 mutal one-to-many 관계, Child hasMany Toys 및 Toy belongsTo Child가있는 설치 모델을 가지고 있습니다. 내부적으로는 실제로 유지 될 장난감 모델에 'childId' 속성이 있습니다. 'child.pushObject (toy) '를 호출하면이 둘 사이의 관계가 설정되고 일단 자식이 저장되면 장난감의 childId 속성이 자동으로 업데이트됩니까? 약속 이행 핸들러에서'toy.set ('child', response) '를 호출해야한다고 생각했습니다. –

8

여기에 대한 답변이 오래되었습니다. Ember Data는 임베디드 레코드를 지원하므로 하나의 큰 페이로드에서 전체 개체 그래프를 가져오고 보내려는 작업을 정확하게 수행 할 수 있습니다. 예를 들어, 모델은 다음과 같이 설정된 경우 :

App.ChildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
    toys: {embedded: 'always'} 
    } 
}); 

이것은 당신이 '장난감'싶은 그 엠버 데이터를 알려줍니다

App.Child = DS.Model.extend({ 
    name: DS.attr('string'), 
    age: DS.attr('number'), 
    toys: DS.hasMany('toy') 
}); 
App.Toy = DS.Model.extend({ 
    name: DS.attr('string'), 
    child: DS.belongsTo('child') 
}); 

당신은 당신의 아이 모델에 대한 사용자 지정 serializer를 정의 할 수 있습니다 '아동'유료 하중의 일부로 포함될 수 있습니다.당신의 API에서 HTTP의 GET 응답은 다음과 같아야합니다

{ 
    "child": { 
    "id": 1, 
    "name": "Todd Smith", 
    "age": 5, 
    "toys": [ 
     {"id": 1, "name": "boat"}, 
     {"id": 2, "name": "truck"} 
    ] 
    } 
} 

을 그리고 당신은 당신의 모델을 저장할 때, 엠버 데이터는 서버에이 보내드립니다 :

여기
{ 
    "child":{ 
     "name":"Todd Smith", 
     "age":5, 
     "toys":[ 
     { 
      "id":"1", 
      "name":"boat", 
      "child":"1" 
     }, 
     { 
      "id":"2", 
      "name":"truck", 
      "child":"1" 
     } 
     ] 
    } 
} 

이를 보여줍니다 JSBin이다. JSbin에서

http://emberjs.jsbin.com/cufaxe/3/edit?html,js,output

, 당신은 '저장'버튼을 클릭하면 서버로 전송 년대 요구를 보려면 데브 관리자를 사용해야합니다.

+0

이것이 선호되는 방법인지 아십니까? 제 이해는 GET 응답에 포함 된 레코드를 포함하는 것이 항상 가장 효율적인 것은 아니라는 것입니다. 그러나 POST/PUT 요청을 작성할 때 레코드를 임베드하면 얻을 수있는 이점을 알 수 있습니다. – antony

+1

@antony, Ember Data에 관한 질문이 아닌 API 디자인 질문을하고 있습니다. 집계를 믿는 경우 (예 : 주문에 주문 항목이 있지만 주문 항목 자체에 신원이 없음) 삽입 된 기록을 사용하려고합니다. 또한 한 번의 원자 트랜잭션 (예 : 주문 및 항목 다시 주문)에서 업데이트가 필요하면 포함 된 레코드를 사용하는 것이 좋습니다. 그러나 모든 모델에 고유 한 식별 가능한 끝 점이있을 수 있으면 포함 된 레코드가 의미가 없습니다. –