5

親レコードをロールバックしても、追加された可能性のある新しい子レコードは削除されないようです。これがバグなのか機能なのかは不明です。

App.Company = DS.Model.extend({
  name: DS.attr('string'),
  employees: DS.hasMany('App.Employee')
});

App.Employee = DS.Model.extend({
  name: DS.attr('string'),
  company: DS.belongsTo('App.Company')
})

var company = App.Company.find(1);
//Initially: company.get('employees.length') => 0

var employee = company.get('employees').createRecord();
//Now: company.get('employees.length') => 1

employee.get('transaction').rollback();
//Still: company.get('employees.length') =>1
//Also: employee.get('isDeleted') => true

company.get('transaction').rollback();
//Even now: company.get('employees.length') =>1

//How do I rollback such that company.get('employees.length') == 0
4

1 に答える 1

0

私のアプリケーションには、get と promise を使用して深さ優先のトラバーサルを行い、親をロールバックする前にすべてをロールバックする rollbackAll() メソッドがあります。次のようになります。

rollbackAll: function() {
  // recursively rollback on all children and self
  this.get('children').then(function (children) {
    children.forEach(function(child) {
      child.rollbackAll();
    });
  });
  this.rollback();
}

これは、アプリケーションに再帰的な関係 (つまり、それぞれが独自の親を持つことができるオブジェクトのツリー) があるためです。

ここでのパターンは、各モデルの「クラス」が独自の rollbackAll メソッドを取得でき、独自の関連付けをロールバックする方法を知っているため、それぞれで rollbackAll() を呼び出すだけでよいというものです。(複数のレベルがある場合は、最も深い子が最初です)。

于 2014-03-17T04:35:18.763 に答える