6

バックボーン リレーショナルプラグインをタスクとメッセージの関連付けで動作させようとしています。(タスクには多くのメッセージがあります)。

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

問題は、逆の関係でキーを「task_id」として設定しない限り、バックボーンリレーショナルが「メッセージ」フィールドにタスクモデルのメッセージを入力しないことです...しかし、それは、メッセージ モデル、task_id フィールドには、上書きされる「task_id」整数ではなく、実際のタスク オブジェクトが入力されます。

親タスクを決定するための外部キーとして 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
    }
  }]
4

2 に答える 2

3

特定の問題に対処するために、keySourceまたはkeyDestinationを使用できる場合があります。

次の例では、 MonsterLoot_Itemの間に 1 対多の関係がある旧式のリレーショナル データベースからデータを取得しているとします。この関係は、 Loot_ItemテーブルのMonster_Id外部キーによって表されます。また、REST サービスが派手なデータのネストを行わないと仮定してみましょう。これは、質問の状況に非常によく一致しているように思われるためです。

キーソース

次に、"keySource" を外部キー ("Monster_Id") に設定し、"key" を実際のデータを格納する属性の名前 ("Monster" など) に設定しましょう。デバッガーを中断すると、実際には「Monster」というフィールドがあり、モンスター モデル データを指している属性オブジェクトが表示されます。おい、かっこいい!

includeInJSON

ただし、その子犬を JSON に変換するとどうなるでしょうか。あなたが望んでいないのと同じように、すべてのモンスターデータを Monster_Id に入れました! ガッ!「includeInJSON」を「Monster_Id」に設定することで修正できます。これで、JSON に変換されると、データを JSON にシリアル化してサーバーに送信するときに、適切な ID が Monster_Id フィールドに戻されます。

問題が解決しました?ええと、実際には、必ずしもそうではありません...

警告: これはすべて非常に便利に思えますが、このシナリオで 1 つのかなり明白な問題が見つかりました。モデルを JSON に変換してからテンプレートに渡す必要があるテンプレート エンジン (Underscore.js のエンジンなど) を使用している場合、リレーショナル データにアクセスできません。悲しいことに、メッセージに必要な JSON は、テンプレートに入力したい JSON と必ずしも同じではありません。

于 2012-05-21T21:13:34.687 に答える
0

メッセージ JSON の「task_id」をタスクの完全な JSON ではなく ID にしたい場合は、「includeInJSON」をタスクの ID プロパティ (「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: "task_id"
    }
  }]

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

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

私の最初の答えは、JSONを次のようにしたいサーバーにメッセージを投稿することです。

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

正確に何をしようとしているのかはわかりませんが、バックボーンリレーショナルが機能するはずの方法は、タスクのメッセージのコレクションが完全なモデルのコレクションになるため、それらを反復処理してに渡すことができますレンダリング用のビューなど

テンプレートなどでメッセージの id の 1 つを出力したい場合は、メッセージ モデルの「id」を取得します。

myTask.get('messages').first().id  ->  returns the first message's id
于 2012-01-02T22:48:26.457 に答える