Upvoting和downvoting帖子 - Meteor

时间:2015-08-07 09:05:49

标签: meteor

向上和向下投票是有效的,但我想做一个像#34;如果用户是downvoter或upvoter"并做正确的事情,如下所述

upvote: function(postId) {    
    check(this.userId, String);    
    check(postId, String);
    var affected = Posts.update({      
        _id: postId,       
        upvoters: {$ne: this.userId}
    },{ 
        $addToSet: {
            upvoters: this.userId
        },  
        $inc: {
            upvotes: 1
        }
    });

    if (! affected)      
        throw new Meteor.Error('invalid', "You already up-voted this post");
},

downvote: function(postId) {    
    check(this.userId, String);    
    check(postId, String);
    var affected = Posts.update({      
        _id: postId,       
        downvoters: {$ne: this.userId},
    }, {      
        $addToSet: {
            downvoters: this.userId
        },  
        $inc: {
            downvotes: 1
        }
    });

    if (! affected)      
        throw new Meteor.Error('invalid', "You already down-voted this post");     
},

使用上面的代码,用户可以进行一次upvote和downvote,但他们可以做到这两点......

如果用户是downvoter并点击upvote,我会编写代码,但我无法弄清楚如何检查用户是下注者还是upvoter。

$pull: {
        downvoters: this.userId
    },
$addToSet: {
        upvoters: this.userId
    },  
    $inc: {
        downvotes: -1
    },
    $inc: {
        upvotes: 1
});

编辑:即使接受的答案正常,我也发现了问题。单击快速时,可能会将投票次数增加2-3次。我只是插入userId而不是增加投票数,而只是计算upvoters / downvoters数组中有多少ID,它们给出相同的结果&它永远不会两次插入相同的userId。

计数帮助者内部:

return this.upvoters.length

此外,inArray是一个有用的工具,用于检查您的值是否在数组中。

if($.inArray(Meteor.userId(), this.upvoters)) //gives true if the current user's ID is inside the array

1 个答案:

答案 0 :(得分:4)

您必须获取帖子并查看其是否包含用户downvoters数组中的ID:

var post = Posts.findOne(postId);
if (post.downvoters && _.contains(post.downvoters, this.userId)) {
  Posts.update({      
      _id: postId
    },
    {
      $pull: {
        downvoters: this.userId
      },
      $addToSet: {
        upvoters: this.userId
      },  
      $inc: {
        downvotes: -1,
        upvotes: 1
      }
    }
  });
}