使用Publish composite进行共享联接:提取用户的帖子+评论

时间:2015-07-29 11:56:12

标签: javascript meteor publish-subscribe

我能够显示特定用户的帖子列表,但无法显示包含特定用户评论的帖子。

官方链接中的示例使用此层次结构 here

对于我的问题,层次结构是:

all posts -> 
(children)
-> find all post by user
-> find all comment by user
   (children)
   -> find post that has id that matches comments

到目前为止我所拥有的......

发布复合线

Meteor.publishComposite('user', function(_id) {  
    return { 
      find: function() { 
        return Meteor.users.find({_id: _id}, { fields: { profile: 1, username: 1} });
      },
      children: [
        {
          find: function(user) { return Posts.find({ userId: user._id }); }
        },
        {
          find: function(user) { return Comments.find({ _id: user._id }); } 
              children: [
                {
                  find: function(comment) { return Posts.find({ _id: comment.postId }); }
                } 
              ] 
        }
      ]
    };
});

在模板中

Template.usersShow.helpers({    
  user: function () {
    return Meteor.users.findOne({ _id: Router.current().params._id });
  }
});

在路由器中

Router.route('/users/:_id', { name: 'users.show',
  waitOn:function(){
    // console.log(this.params._id);
    return Meteor.subscribe('user', this.params._id);
  }
});

html

  {{#with user}}
    <div class>{{ profile.name }}</div>    <!-- name appears --> 
    {{#ionList}}
      {{#each post}}
        {{> postItem}}
      {{/each}}
    {{/ionList}}
  {{/with}}

1 个答案:

答案 0 :(得分:1)

我第一眼看到的是:

  • 您根本不需要发布pullDatauser出版物可以完成您在1)中提到的工作。
  • 在您的代码中尝试按照模式查找属于posts的{​​{1}}和comments

user 只需使用children: [ { find: function(user) { return Posts.find({ authorId: user._id }); } }, { find: function(user) { return Comments.find({ authorId: user._id }); } } ] authorId计划中的相应字段名称替换Post

我发现了Comment在Meteor中发布联接的出色解决方案。

Join in Meteor with publishComposite

希望这有帮助,

亚历

P.S。我重新阅读了您编辑过的问题,并建议您:

  • 在视图中分割您的应用(阅读模板),例如publishCompositeAllPosts MyPostsTopTenPostsPostsByUserPostWithComments等。
  • 定义每个视图必须显示的内容,并将内容转换为订阅
  • 为每个订阅定义发布(您可能想以某种方式存根)
  • 确保您的观点符合预期
  • 重构出版物,因此他们只从mongo中获取必要的数据以获取特定视图
TDD拯救。