2012-03-07 19 views
4

UsersTasksの2つのコレクションを持つアプリがあるとします。これらの間に多対多の関連付けがあります。タスクは任意の数のユーザーと関連付けることができ、その逆もあります。新しい協会を扱う最良の方法は何でしょうか?入力として、モデル(またはコピー)とthis.tasks.create()を行い、その後Backbone.jsでどのように関連付けの変更を処理する必要がありますか?

Users = Backbone.Model.extend({ 
    this.tasks = new Tasks; 
    ... 
}); 

一つのアプローチは、各ユーザーのタスクの新しいコレクションを割り当てることです。

この問題は、タスクにすでにIDが設定されていることが原因です。モデルにIDがある場合、Backboneは更新を行いたいと考えます。そうではなく、このような何か:

PUT /users/156/tasks/15

あなたが望むものではありません。

POST /users/156/tasks

あなたはこのような何かを得ます。そのモデルのisNew()関数を再定義して、BackboneにPOSTを実行させることはできますが、これはハックのようです。

もう1つの方法は、両端のIDのリストを維持することです。例えば、UserモデルJSONは次のようになります。

{ 
    username: "jsmith" 
    name: "Joe Smith" 
    tasks: [5, 15, 256] 
} 

ちょうどあなたが追加したいモデルからIDをつかむと、ユーザーのPUTを行います。

ここでの問題は、ワイヤを介してより多くのデータが送信され、特定の変更が示されないことです。サーバは、モデルをフィルタリングし、変更されたものを見つけ出し、必要に応じて関連付けを追加/削除するために、もっと多くの作業をしなければなりません(バックエンドはSQLなので、埋め込まれたタスクリストや何かを扱うだけではありません)。必要とされる特定の協会の変更を要求する方がはるかに良いようです。

どのようなアプローチが最も良いようですか?私が考えていない別の選択肢がありますか?私は、例えば、オブジェクト彼らは自己と関係なくを扱う特定のルートを作成してこれらのケースについては

+0

ステートレスな状態を維持し、options.dataハッシュを使用するごとにタスクコレクションをフェッチするだけで済みます。 –

+0

私はなぜあなたが1つを作成するときにタスクがIDを持っているのか分かりません –

+0

それはあなたがイベントにバインドするイベント、特定のイベントで実行されるコードに応じて、あなたが何をしているかによって異なります。あなたがすべてのユーザーのサブ引数としてコレクションを持っていればパフォーマンスが低下します。バックボーン・リレーショナルを避ける理由は何ですか? – Sander

答えて

1

(私はバックボーン・リレーショナルのようなバックボーンの拡張を避けたい注意):

の作成 我々はそれをやっている私たちが実際に起因する純粋なRESTのAPIに近いこのアプローチを使用していない
POST /users/156/tasks_relations 

(POST)Taskが、作成(POST)TaskRelation

バックボーンでは、私はまた関係を表す特定TaskRelationモデルを持っている:

// code simplified and not tested 
var TaskRelation = Backbone.Model.extend({ 
    urlRoot: function(){ 
    return this.user.url + "/tasks_relations"; 
    }, 

    initialize: function(opts){ 
    this.user = opts.user; 
    } 
}); 

のでUserに、私たちはこのようにサーバに新しいTaskRelationを送ることができます。

// code simplified and not tested 
var User = Backbone.Model.extend({ 
    addTask: function(task){ 
    var task_relation = new TaskRelation({ user: this, task_id: id }); 
    task_relation.save(); 
    } 
}) 

サーバーをパラメータが使用され、そのビジネスを行います。

関連する問題