繁体   English   中英

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

[英]5-star rating system with four attributes

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

我需要使用Parse.com建立一个评分系统,其中每个对象都有四个可以从1到5排名的属性。我所知道的是,我必须为此设置一个单独的类。 至此,我所做的就是表的列看起来如何:
objectIdParse每个对象时都有它
attr1 (int)属性编号1
attr2 (int)属性2
attr3 (int)属性3
attr4 (int)属性编号4
objectPointer Pointer额定对象的Pointer
votesSum -(两倍)总和

它将像这样工作:将每个比率添加到现有比率,并且当某人想知道特定对象的比率是多少时,则将每个属性的总和除以votesSum 当然,还有其他问题:-如何避免同一用户对同一对象进行评级? (也许是数组?)-如何让用户修改其评分(这是更大的问题)

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

通过在评级对象上包含指向用户的指针,可以解决两个问题。 可以在beforeSave上不允许使用beforeSavebeforeSave它将尝试使用相同的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);
    });
});

请注意,如果我们找到一个现有的Rating对象,其中同一用户正在对同一对象进行评分,那么我们只是删除现有对象。 由于我们是在beforeSave上执行的,因此新的将被有效保存并编辑原始文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM