具有四个属性的5星评级系统

5-star rating system with four attributes

我找不到这个的任何实现。

我需要使用 Parse.com 做一个评级系统,其中每个对象都有四个属性,可以从 1 到 5 进行排序。我所知道的是我必须有一个单独的 class为了那个原因。到目前为止,我所做的是 table 的专栏看起来像:
objectId - 在 Parse 每个对象都有它
attr1 - (int) 属性编号 1
attr2 - (int) 属性编号 2
attr3- (int) 属性号 3
attr4- (int) 属性号 4
objectPointer - 一个 Pointer 到评级对象
votesSum - (双)票数

它会这样工作:每个比率都加到现有比率上,当有人想知道特定对象的评分是多少时,每个属性的总和除以 votesSum。当然还有其他问题: - 如何防止相同用户对同一对象进行评分? (可能是阵列?) - 如何让用户修改他们的评分(这是一个更大的问题)

我在这里寻找非常简单的概念。也许你以前遇到过这个问题。

这两个问题都可以通过在评级对象上包含指向用户的指针来解决。在 beforeSave 上不允许使用倍数,这将尝试查找具有相同 objectPointer 和相同 userPointer(新列)的现有评级。

而且,在找到现有评级后,beforeSave 可能会 return 出错,或者 - 甚至更好 - 只需修改现有评级,这就是应用程序允许用户的方式修改他们的评分。

对于一个有 千个评分 的系统。保留评分总数对象也可能有意义。

总结一下:

Rating object:
    objectPointer - pointer to object being rating
    userPointer - pointer to the user doing the rating
    attr1 - (int) rating for the objects attr1
    attr2 - etc
    (no sum here)

RatingTotal object:
    objectPointer - pointer to object being rating
    ratingsCount  - (int) total rating objects that exist for this objectPointer
    totalAttr1 - (int) sum of rating objects attr1
    totalAttr2 - etc


Parse.Cloud.beforeSave("Rating", function(request, response) {
    // find out if there's an existing rating object
    var query = new Parse.Query("Rating");
    query.equalTo("objectPointer", request.object.objectPointer);     
    query.equalTo("userPointer", request.object.userPointer);
    query.find().then(function(result) {
        // one exists?  just delete it, and this save will replace it
        return (result)? result.destroy() : null;
    }).then(function() {
        // update the summary object
        var query = new Parse.Query("RatingTotal");
        query.equalTo("objectPointer", request.object.objectPointer);
        return query.find();     
    }).then(function(result) {
        var RatingTotal = Parse.Object.extend("RatingTotal");
        // create one if it doesn't exist
        var ratingTotal = (result)? result : new RatingTotal();
        ratingTotal.set("ratingsCount", 1+ratingTotal.get("ratingsCount"));
        var attr1 = request.object.get("attr1");
        ratingTotal.set("totalAttr1", attr1+ratingTotal.get("totalAttr1"));
        // and so on for attrs 2, 3, etc
        return ratingTotal.save();
    }).then(function() {
        response.success();
    }, function(error) {
        response.error(error);
    });
});

请注意,如果我们找到一个现有的评级对象,其中同一用户对同一对象进行评级,那么我们只需删除现有的评级对象。因为我们在 beforeSave 上执行此操作,所以新的将被保存......有效地和 edit 原始的。