6

backbone-relationalプラグインがタスクとメッセージの関連付けを処理しようとしています。 (タスクには多くのメッセージがあります)。Backbone-relational:外部キーと同じでない限り、アソシエーションキーは機能しません

情報は、外部キーとしてtask_idフィールドを持つ標準のrails/activerecordサイトから取得されます。

backbone-relationalは、逆の関係でキーを「task_id」に設定しない限り、「メッセージ」フィールドに「メッセージ」フィールドにメッセージを入力しません。メッセージモデルのタスクでは、task_idフィールドには、実際のタスクオブジェクトが入力されますが、上書きされる 'task_id'整数ではありません。

親タスクを決定するための外部キーとしてtask_idを指定する簡単な方法はありますが、キーが表すオブジェクトを別のフィールド(メッセージオブジェクトの 'タスク'など)に置くことは簡単です。しかし、私はどのように把握することはできません。任意のアイデアを高く評価タスクのID、いない完全なJSONであることをメッセージJSONで「TASK_IDを」したい場合は、コードは

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: true 
    } 
    }] 
+0

どうすれば問題を解決できましたか?私は同じ理由でギットブブで次の問題を開いた。ありがとう。 [オブジェクトに埋め込まれた外部キー](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

答えて

3

keySourceまたはkeyDestinationを使用して、特定の問題に対処することができます。

次の例では、我々はモンスターLoot_Itemの間に1対多の関係がある古い学校のリレーショナル・データベースからデータを取得しているとします。この関係はMonster_Id外部キーで表され、Loot_Itemテーブルに表されます。私たちのRESTサービスは、あなたの質問の状況をかなり緊密に一致させるように思われるので、私たちのためにファンシーパンツのデータネストをしないとしましょう。

keySource

それでは、私の外部キー(「Monster_Id」)と私は、実際のデータが行きたい属性(たとえば、「モンスター」の名称を「キー」に設定し、「keySource」を設定してみましょう)。デバッガを起動すると、属性オブジェクトに「Monster」というフィールドがあり、モンスターモデルのデータを指していることがわかります。ねえ、クール!

includeInJSON

ただし、その子犬toJSON場合、何を思いますか?あなたが望んでいないのと同じように、Monster_Idにすべてのモンスターデータを入れました! GAH! "includeInJSON"を "Monster_Id"に設定することで修正できます。今度は、JSONに変換されると、データをJSONにシリアル化してサーバーに送信するときに、適切なIDをMonster_Idフィールドに戻します。

問題が解決しましたか?えー、まあ、実際には、ない必ずしも ...

CAVEAT:このすべてが超便利に聞こえるが、私は、このシナリオで発見した1つのかなり明白な問題があります。テンプレートに渡す前にモデルをJSONに変換する必要があるテンプレートエンジン(Underscore.jsのテンプレートエンジンなど)を使用している場合、whoops - あなたはリレーショナルデータにアクセスできません。うーん、私たちのメッセージに必要なJSONは、必ずしもテンプレートに納めたいJSONと同じではありません。

+1

どうしたらこの問題を修正しましたか?たぶん私は何かを逃した。私はgithubで次の問題を開いた。 [オブジェクトに埋め込まれた外部キー](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

+2

旧式の学校?本当に? – prauchfuss

+0

Smokefoot、RDBMSは70年代初め以来(少なくとも)存在してきました。コンピューティングの面では、それはかなり「古い学校」です。しかし、それはその有用性についての価値判断ではありません。それらは堅牢で、ユースケースは非常によく理解されており、互換性のある多くの技術があります。残念なことに、多くの本当に新しいテクノロジは、適切に設計されたリレーショナルデータベースとの互換性を否定しています。そのため、Backbone-relationalなどのサードパーティ製のアドオンに依存している理由と、 – Tess

0

の下に、[タスクのIDプロパティ(「TASK_ID」)であることを「includeInJSON」を設定しました

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: "task_id" 
    } 
    }] 

includeInJSONの「true」という値は、関連するモデルに完全なJSONを使用すると言います。

編集:質問を再読した後、私の回答があなたの問題に関連しているかどうかわかりません。

私のオリジナルの答えが戻ってあなたはJSONのようなものにしたいサーバーにメッセージを投稿するためである

{ 
    "message_title": "My Title", 
    "message_body": "Blah blah blah...", 
    "task_id": 12345 
} 

私はあなたが起こるために探している正確にわからないんだけど、道Backbone Relationalは、仕事のコレクションが完全なモデルのコレクションであるため、それらを反復してレンダリングなどのためにビューに渡すことができます。

メッセージのIDがテンプレートなどの中にある場合、Messageモデルの「ID」を取得します。

myTask.get('messages').first().id -> returns the first message's id 
+1

どうしたらこの問題を修正しましたか?たぶん私は何かを逃した。私はgithubで次の問題を開いた。 [オブジェクトに埋め込まれた外部キー](https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

関連する問題