这两个问题都可以通过在评级对象中包含一个指向用户的指针来解决。可以在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上执行此操作,因此新的操作将被有效保存,并且编辑。
所以,你建议为每个评价制作新的对象?对于数据库来说不是很麻烦吗? –
是的。你已经完全理智地描述了这个新对象。只需添加一个用户指针。一点都不为数据库带来麻烦。这正是数据库的用途。为你创建一个新班级有点麻烦,但这正是程序员的职责(:-))。严重的是,如果用户对事物进行评级在您的业务问题中是一个独特的概念,那么它应该是数据库中的一个独特对象。 – danh
太棒了!还有一个问题 - 如何计算某个对象的所有评级?查询课程中的所有评分,然后按大小列表划分每个评分? –