3

2 つの属している関係を持つモデルで、ember-data トランザクション (レコードの作成とコミット) を管理しようとしています。最初は、(Coffeescript で) 以下を使用してトランザクションに新しいレコードを追加するだけでした。 @transaction.createRecord(App.Book, {author: App.router.authorController.get('content')})

これにより、author 属性 (DS.belongsTo 関係) が現在の著者に設定され、フォームで、ユーザーが書籍の他の属性を設定します。これには、select 要素 (出版社としましょう) からの別の belongsTo 関係が含まれます。これは問題なく動作しますが、ユーザーが 2 番目の新しいレコードを作成しようとすると、次のアサーションが発生します。

Ember.assert("All records in a changed relationship must be in the same transaction. You tried to change the relationship between records when one is in " + t + " and the other is in " + prev, t === prev);

これは、Ember Data の one_to_many_change.js ファイルの 203 行目からのものです。

これは、関連するすべてのモデル オブジェクトを手動でトランザクションに追加する必要があることを意味します。したがって、次のようなものを使用して、オーサー モデルをトランザクションに追加できます。

author = App.router.authorController.get('content')
@transaction.add(author)

そして、トランザクションに関係する影響を受ける可能性のあるすべてのパブリッシャー モデルに対して同じことを行います (私はこれらの操作をコンソール内で行っていました)。ただし、これを行うと、次のエラーが発生します。

Error: assertion failed: Once a record has changed, you cannot move it into a different transaction

これは、前の (元の) トランザクションがコミットされていた場合でも発生します。他の人がこの問題をどのように扱っているのか疑問に思っています。トランザクション内でこの種の関係を割り当てることは、Ember Data アプリでは一般的なプロセスであるに違いないと思います。

4

1 に答える 1

0

authorオブジェクトが変更され、デフォルトのトランザクションにアタッチされたようです。次に、新しいトランザクションを作成し、このトランザクションで帳簿を作成します。

次に、永続化する必要がある 2 つのレコードがあり、両方とも関連付けを介してリンクされていますが、別のトランザクションにあります。

それを行う 1 つの方法は、authorトランザクションを使用してブックを作成することです。

var book = author.get('transaction').createRecord(App.Book, {author: author});
于 2013-04-06T18:08:42.217 に答える