2016-03-02 87 views
0

我找不到這個的任何實現。具有四個屬性的五星級評分系統

我需要使用Parse.com做評級系統,每個對象都有四個屬性,可以從1到5排序。我知道的是,我必須爲此分配一個類。我已經決定了這一點是表的列會怎麼看起來像:
objectId - 在Parse每一物體都有其
attr1 - (int)的屬性沒有1
attr2 - (int)的屬性沒有2
attr3 - (int)的屬性沒有3
attr4 - (int)的屬性沒有4
objectPointer - 一個Pointer額定對象
votesSum - 票的(雙)總和

它會這樣工作:每個費率都加上現有費率,當有人想知道特定對象的評級是多少時,則每個屬性的總和除以votesSum。當然還有其他問題: - 如何讓同一用戶免受同一對象的評分? (陣列也許?) - 如何讓用戶修改他們的評級(這是更大的問題)

我在這裏尋找真正簡單的概念。也許你以前遇到過這個問題。

回答

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上執行此操作,因此新的操作將被有效保存,並且編輯

+0

所以,你建議爲每個評價製作新的對象?對於數據庫來說不是很麻煩嗎? –

+0

是的。你已經完全理智地描述了這個新對象。只需添加一個用戶指針。一點都不爲數據庫帶來麻煩。這正是數據庫的用途。爲你創建一個新班級有點麻煩,但這正是程序員的職責(:-))。嚴重的是,如果用戶對事物進行評級在您的業務問題中是一個獨特的概念,那麼它應該是數據庫中的一個獨特對象。 – danh

+0

太棒了!還有一個問題 - 如何計算某個對象的所有評級?查詢課程中的所有評分,然後按大小列表劃分每個評分? –