javascript - 四大属性五星级评级体系

标签 javascript parse-platform rating-system

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

我需要使用 Parse.com 建立一个评级系统,其中每个对象都有四个属性,可以从 1 到 5 进行排名。我所知道的是,我必须为此拥有一个单独的类。到目前为止,我所做的是表的列的外观:
objectId - 在Parse中每个对象都有它
attr1 - (int) 属性号 1
attr2 - (int) 属性号 2
attr3-(int)属性号 3
attr4-(int)属性号 4
objectPointer - 指向评级对象的指针
votesSum - (双)票数总和

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

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

最佳答案

这两个问题都可以通过在评级对象上包含指向用户的指针来解决。 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 上执行此操作,因此新的文件将被有效地保存并编辑原始文件。

关于javascript - 四大属性五星级评级体系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35750973/

相关文章:

android - Parse.com, Parse SDK 下载 SDK 中没有 Parse-1.10.3.jar 文件

javascript - 星级评定系统仅更新列表中的第一项

xaml - Windows 8 中的评级控制

python - Django 星级评分系统和 AJAX

javascript - 在 Rails 中使用 CoffeeScript 显示表单输入值

javascript - 在 Knockout JS 中延迟加载

javascript - 获取数组内数组的最大值

ios - 在 App 扩展中集成 Parse

javascript - keydown 不会在移动设备上触发 Chrome

ios - 使用 Parse 从 Swift 中的闭包中捕获值