2

私はデッキのコレクションを持っており、各デッキには多数のカードがあります。フィールド「cards」は、デッキ内のカードの ID を保持する配列です。

問題は、ユーザーがデッキに追加するカードを選択できるカード リストがあることです。ユーザーが Decks コレクション内のカード配列に追加するカードを選択すると、部分を使用してリストをレンダリングしない限り、Deps は「同じブランチに 2 番目のランドマークを作成できません」という例外をスローします。各カードには独自のイベントがあるためです。ページを更新すると更新が表示されるため、データは適切にデッキに追加されます。

Decks.js

Template.deckList.deck = () ->
  Decks.findOne(_id: Session.get "deck").cards

Deck-list.html

<template name="deckList">
    <section class="deck-list"><h1>deck</h1>
    <ul class="cards">
        {{#each deck}}
            {{> cardInList}}
        {{/each}}
    </ul></section>
</template>

今、私は両方の ID (カードとデッキ) を保持する別のコレクションを作成することを考えましたが、同じ問題を持つ将来のコレクションでは機能しない可能性があります (たとえば、ゲーム コレクションの手)。

ありがとう!

4

1 に答える 1

2

あなたは正しい道を進んでいますが、私があなたを正しく理解していれば、そこには悪い設計があります。カードを追加/削除するたびにデッキ ドキュメントの配列を更新する必要はありません。cardsデッキ ドキュメントのフィールドを省略し、代わりにdeckIdカード ドキュメントにフィールドを追加する方が簡単です。MongoDB ではフィールドのネスト/埋め込みが推奨されることがよくありますが、Meteor コレクションは通常、典型的なリレーショナル データベース スタイルのスキーマではるかにうまく機能します。あなたの問題に対するこのアプローチをチェックしてください:

Decks.js

Template.deckList.deck = () ->
  Decks.findOne( _id: Session.get "deck" )

Template.deckList.cards = () ->
  Cards.find( deckId: Session.get "deck" )

Deck-list.html

<template name="deckList">
  <section class="deck-list">
    <h1>{{#with deck}} {{title}} {{/with}} Deck</h1>
    <ul class="cards">
      {{#each cards}}
      {{> card }}
      {{/each}}
    </ul>
  </section>
</template>

<template name="card">
  <li>{{foobar}}</li>
</template>

このアプローチを使用すると、デッキにカードを追加/削除するだけで、別のデータベース コレクションで追加のドキュメントを更新する必要なく、変更がリアルタイムで自動的に反映されます。

編集: 1 対多ではなく多対多のコレクションが必要な場合は、サーバーの publish メソッドを変更して、特定のデッキのカードを返すようにし、その接続テーブルをクライアント。次のようになります。

// Server publish method
// Return just cards that are in deck "deckId"
Meteor.publish('cards', function (deckId) {
    var cardIds = CardsDecks.find({ deckId: deckId }).map(function (connector) {
        return connector.cardId;
    });

    return Cards.find({ _id: {$in: cardIds } });
});

// Client subscribe method
Meteor.subscribe('cards', Session.get('currentDeckId')); // Get just the cards related to the current deck

乾杯!

注:これはCodersClanで最初に回答されたものです。

于 2013-11-03T19:35:20.373 に答える