具有四个属性的5星评级系统
5-star rating system with four attributes
我找不到这个的任何实现。
我需要使用 Parse.com 做一个评级系统,其中每个对象都有四个属性,可以从 1 到 5 进行排序。我所知道的是我必须有一个单独的 class为了那个原因。到目前为止,我所做的是 table 的专栏看起来像:
objectId
- 在 Parse
每个对象都有它
attr1
- (int) 属性编号 1
attr2
- (int) 属性编号 2
attr3
- (int) 属性号 3
attr4
- (int) 属性号 4
objectPointer
- 一个 Pointer
到评级对象
votesSum
- (双)票数
它会这样工作:每个比率都加到现有比率上,当有人想知道特定对象的评分是多少时,每个属性的总和除以 votesSum
。当然还有其他问题:
- 如何防止相同用户对同一对象进行评分? (可能是阵列?)
- 如何让用户修改他们的评分(这是一个更大的问题)
我在这里寻找非常简单的概念。也许你以前遇到过这个问题。
这两个问题都可以通过在评级对象上包含指向用户的指针来解决。在 beforeSave
上不允许使用倍数,这将尝试查找具有相同 objectPointer 和相同 userPointer(新列)的现有评级。
而且,在找到现有评级后,beforeSave
可能会 return 出错,或者 - 甚至更好 - 只需修改现有评级,这就是应用程序允许用户的方式修改他们的评分。
对于一个有 千个评分 的系统。保留评分总数对象也可能有意义。
总结一下:
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 上执行此操作,所以新的将被保存......有效地和 edit 原始的。
我找不到这个的任何实现。
我需要使用 Parse.com 做一个评级系统,其中每个对象都有四个属性,可以从 1 到 5 进行排序。我所知道的是我必须有一个单独的 class为了那个原因。到目前为止,我所做的是 table 的专栏看起来像:
objectId
- 在 Parse
每个对象都有它
attr1
- (int) 属性编号 1
attr2
- (int) 属性编号 2
attr3
- (int) 属性号 3
attr4
- (int) 属性号 4
objectPointer
- 一个 Pointer
到评级对象
votesSum
- (双)票数
它会这样工作:每个比率都加到现有比率上,当有人想知道特定对象的评分是多少时,每个属性的总和除以 votesSum
。当然还有其他问题:
- 如何防止相同用户对同一对象进行评分? (可能是阵列?)
- 如何让用户修改他们的评分(这是一个更大的问题)
我在这里寻找非常简单的概念。也许你以前遇到过这个问题。
这两个问题都可以通过在评级对象上包含指向用户的指针来解决。在 beforeSave
上不允许使用倍数,这将尝试查找具有相同 objectPointer 和相同 userPointer(新列)的现有评级。
而且,在找到现有评级后,beforeSave
可能会 return 出错,或者 - 甚至更好 - 只需修改现有评级,这就是应用程序允许用户的方式修改他们的评分。
对于一个有 千个评分 的系统。保留评分总数对象也可能有意义。
总结一下:
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 上执行此操作,所以新的将被保存......有效地和 edit 原始的。