五星评级系统,具有四个属性

时间:2016-03-02 15:08:33

标签: javascript parse-platform rating-system

我找不到任何这个实现。

我需要使用Parse.com进行评级系统,其中每个对象有四个属性,可以从1到5进行排名。我所知道的是,我必须有一个单独的类。我在这一点上所做的就是表格列的外观如下:
FileOutputStream fOut = new FileOutputStream(myFile,true); OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut,true); myOutWriter.append() - 在objectId中,每个对象都有它 Parse - (int)属性no 1
attr1 - (int)属性no 2
attr2 - (int)属性no 3
attr3 - (int)属性no 4
attr4 - objectPointer到评级对象
Pointer - (双倍)票数

它可以这样工作:每个费率都会添加到现有费率中,当有人想知道特定对象的评级是什么时,每个属性的总和除以votesSum。当然还有其他问题: - 如何防止同一用户对同一对象进行评级? (数组也许?) - 如何让用户修改他们的评级(这是更大的问题)

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

1 个答案:

答案 0 :(得分:1)

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

并且,在发现现有评级后,beforeSave可能会返回错误,或者 - 甚至更好 - 只需修改现有评级,即应用允许用户修改评级的方式。

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

总结一下:

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上执行此操作,因此新的将保存...有效并且编辑原始的