4

シナリオは次のとおりです。トピックのリストがあり、各トピックには投稿が含まれており、各投稿はユーザーのリストによって「いいね」されました。したがって、私のデータは次のようになります。

"topics": {
    "topic1": {
        "posts": {
            "post1": true,
            "post2": true
        }
     }
 },
 "posts": {
     "post1": {
         "title": "An awesome post",
         "likes": {
             "user1": true
         }
     },
     "post2": {
         "title": "An even better post",
         "likes": {
             "user1": true,
             "user2": true
         }
     }
 },
 "users": {
     "user1": {
         "name": "Mr. T",
         "email": "t@t.com"
     },
     "user2": {
         "name": "Mr. Hello World",
         "email": "hello@world.com"
     }
 }

私は、Firebase.util ( http://firebase.github.io/firebase-util ) を使用してトピックのすべての投稿を取得する方法を知っていると思います:

Firebase.util.intersection(
    fb.child('topics').child('topic1').child('posts'),
    fb.child('posts')
)

しかし今は、各投稿に、その投稿を気に入ったユーザーの名前を含めたいと考えています。どうやってそれを行うのですか?

おそらく何も変わらないでしょうが、これはすべて AngularFire で起こっています。

4

1 に答える 1

3

ここで実際の例を参照してください

この種の非正規化の要点は、投稿を取得するときにユーザーを取得することです。見た目ほど複雑ではありません。それらをつかむだけです。

Firebase はリクエストを最適化し、すべてのリスナーに対して同じソケット接続を再利用するために内部で多くの作業を行うため、これは非常にパフォーマンスが高く、別のパスに分割されているかどうかに関係なく、ダウンロードされるバイト数よりもわずかにオーバーヘッドが大きくなります。または一緒に保管します。

HTML:

<h3>Normalizing user profiles into posts</h3>

<ul ng-controller="ctrl">
    <li ng-repeat="post in posts | orderByPriority" ng-init="user = users.$load(post.user)">
        {{user.name}}: {{post.title}}
    </li>
</ul>

JavaScript:

var app = angular.module('app', ['firebase']);
var fb = new Firebase(URL);

app.controller('ctrl', function ($scope, $firebase, userCache) {
    $scope.posts = $firebase(fb.child('posts'));
    $scope.users = userCache(fb.child('users'));
});

app.factory('userCache', function ($firebase) {
    return function (ref) {
        var cachedUsers = {};
        cachedUsers.$load = function (id) {
            if( !cachedUsers.hasOwnProperty(id) ) {
                cachedUsers[id] = $firebase(ref.child(id));
            }
            return cachedUsers[id];
        };
        cachedUsers.$dispose = function () {
            angular.forEach(cachedUsers, function (user) {
                user.$off();
            });
        };
        return cachedUsers;
    }
});
于 2014-04-19T17:43:49.730 に答える