我找不到任何这个实现。
我需要使用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
。当然还有其他问题:
- 如何防止同一用户对同一对象进行评级? (数组也许?)
- 如何让用户修改他们的评级(这是更大的问题)
我在这里寻找非常简单的概念。也许你以前遇到过这个问题。
答案 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上执行此操作,因此新的将保存...有效并且编辑原始的。