這兩個問題都可以通過在評級對象中包含一個指向用戶的指針來解決。可以在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
太棒了!還有一個問題 - 如何計算某個對象的所有評級?查詢課程中的所有評分,然後按大小列表劃分每個評分? –