0

Firebaseで多対多リレーションシップをどのように構造化するかに関する多くの例が見つかりました。Firebase多対多リレーションシップをビュー(AngularFire)に表示するためのベストプラクティス

/posts: 
    -K_GOdSQvCQ2sAcHfo1x 
    - descpripton: "This is a post..." 
    - title: "This is a title..." 
    - tags: 
     -K_aBTTDKVUovZe3l0lX: true 
     ..... 
    -K_GFDQjPoSmCJM3YAlB: 
    - description: "Another post..." 
    - title: "This title..." 
    - tags: 
     -K_aBTTKDhYsnbFv1Tuc: true 
     ...... 

/tags: 
     -K_aBTTDKVUovZe3l0lX 
     - name: "Sport" 
     - postIds: 
      -K_GOdSQvCQ2sAcHfo1x: true 
      ..... 

     -K_aBTTKDhYsnbFv1Tuc: 
     - name: "Movies" 
     - postIds: 
      -K_GFDQjPoSmCJM3YAlB: true 
      ..... 

私の問題は、私の見解では、これらの関係を処理する方法を考え出すされています。私はFirebaseに、私はいくつかの基本的な柱とタグデータを持ってそれを設定するために見た中で最も推奨される方法を以下に示します。私はそれをカバーするチュートリアルや例を見つけることができませんでした。たとえば、インデックスビューでは、それぞれのタグが付いたすべての投稿をリストしたいと思います。

これまでのところ、すべての投稿とすべてのタグを返信して別の$scope変数に保存していました。それは問題ありませんが、私は各投稿に関連してタグだけを表示する方法を理解することができませんでした。私はまず、入れ子になったng-repeat構造を試してみるべきだと考えました。しかし、これは私が期待していた以上に厄介なことを証明しています。

これは私が達成しようとしているアイデアです。

<!-- For each tag in post object iterate tags --> 
<div data-ng-repeat="t in posts.tags"> 
    <span data-ng-repeat="tag in tags"> 
     <!-- display only tags here that match with post.tag.id --> 
    </span> 
</div> 

私はそれがng-repeatと連動して角度のfilterを使用して、おそらく可能であることを考えているが、私はから動作するように任意の例を見つけること運がなかったしました。多分、私がしようとしているのは、単独で見ることや、あまりにも扱いにくい/醜いことです。誰かに私がそれにアプローチする方法についてのいくつかの指針を私が与えることができるなら、それは素晴らしいことでしょう!

UPDATE

[OK]を、私はこれを達成する方法を発見したが、私はそれが最適ではないと確信しています。誰かが私により良いアプローチを知らせることができれば、私は感謝しています。

たとえば、以下のコードでは、を使用するとpoststagsと一致させる正しい方法ではないと感じています。たぶん、これを行うにはブール値を使用する標準的な方法がありますか?私はまだFirebase/AngularFireの新機能ですので、この問題を解決するための新しいデザインパターンを知りたいと思っています。

また、目標はかなり標準的です。 poststagsは多対多の関係を持つ別々のFirebaseノードから来ています(投稿に多数の投稿に多くのタグとタグを含めることができます)。

インデックスビューのコントローラでは、すべての投稿とすべてのタグが取得され、それぞれの変数に個別に保存されます($scope)。次のビューコードは、各投稿のプレビュー内に関連するタグを表示する方法を示しています。

<li data-ng-repeat="post in posts"> 
    ........ 
    <div ng-repeat="tag in tags">  // Iterate tags  
     <div ng-repeat="(key, value) in tag.postIds"> // Iterate postIds in each tag 
     // Check tag.postId key against the current post id. 
     // Should be using booleans some way here instead?? 
     <h5 ng-if="key === post.$id"> 
      <span class="label label-default"> 
       {{tag.name}} 
      </span> 
     </h5> 
     </div> 
    </div> 
</li> 

答えて

0

短い回答:データを非正規化します。

少し長い答え:データをクエリするときに効率的にデータを保存する必要があります。この特定のケースでは、関連性のみを示すtrueの代わりにタグの名前を保存できます。

ので、代わりの

{ 
    posts: 
    -K_GOdSQvCQ2sAcHfo1x: { 
     descpripton: "This is a post...", 
     title: "This is a title...", 
     tags: { 
     -K_aBTTDKVUovZe3l0lX: true 
     } 
    } 
} 

あなたは公式Firebaseシャネルからの動画(this playlistのように、など)

{ 
    posts: 
    -K_GOdSQvCQ2sAcHfo1x: { 
     descpripton: "This is a post...", 
     title: "This is a title...", 
     tags: { 
     -K_aBTTDKVUovZe3l0lX: "Sport" // <----- Notice the change 
     } 
    } 
} 

ウォッチthisようにそれを救うことができます。非常に役に立ちます。

関連する問題