2016-03-02 91 views
0

我找不到这个的任何实现。具有四个属性的五星级评分系统

我需要使用Parse.com做评级系统,每个对象都有四个属性,可以从1到5排序。我知道的是,我必须为此分配一个类。我已经决定了这一点是表的列会怎么看起来像:
objectId - 在Parse每一物体都有其
attr1 - (int)的属性没有1
attr2 - (int)的属性没有2
attr3 - (int)的属性没有3
attr4 - (int)的属性没有4
objectPointer - 一个Pointer额定对象
votesSum - 票的(双)总和

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

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

回答

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

+0

所以,你建议为每个评价制作新的对象?对于数据库来说不是很麻烦吗? –

+0

是的。你已经完全理智地描述了这个新对象。只需添加一个用户指针。一点都不为数据库带来麻烦。这正是数据库的用途。为你创建一个新班级有点麻烦,但这正是程序员的职责(:-))。严重的是,如果用户对事物进行评级在您的业务问题中是一个独特的概念,那么它应该是数据库中的一个独特对象。 – danh

+0

太棒了!还有一个问题 - 如何计算某个对象的所有评级?查询课程中的所有评分,然后按大小列表划分每个评分? –