我找不到这个的任何实现。
我需要使用 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/