2016-09-07 4 views
1

Ich brauche Hilfe mit Logik. Ich habe "nützliche" und "notUseful" -Schaltfläche auf Bewertungen auf meiner Website. Ich habe es so gemacht, dass wenn ein Benutzer auf sie klickt, ich ein Objekt wie usefulness: { usefulResult: 1, notUseful: 0, useful: 1 }, bekomme, so dass jedes Mal, wenn der Benutzer auf eine Schaltfläche klickt, die entsprechende Eigenschaft inkrementiert wird. und usefulResult ist nur useful - notUseful.Lassen Sie die Benutzer nur einmal pro Thema abstimmen, aber sie können ihre Meinung ändern

Das Hauptproblem, das ich jetzt habe, ist, dass ich möchte, dass ein Benutzer nur eine Stimme für eine Überprüfung abgeben kann, aber sie könnten später ihre Meinung ändern. Ich weiß, wie man herausfinden kann, welcher Benutzer die Abstimmung durchführt. aber ich kann nicht an die Logik denken, also wird der Count mehr als 1 Stimme nicht erhöhen.

Das ist schlecht: bad: Benutzer konnte klicken Sie auf NotUseful-Schaltfläche und die NotUseful-Schaltfläche Zähler steigt weiter.

Info: Das usefulness-Objekt hat die Anzahl für alle Benutzer für eine bestimmte Überprüfung, so dass es bereits aus früheren Daten gefüllt werden konnte. also sagen wir mal, die Daten waren ursprünglich usefulness: { usefulResult:-2 , notUseful: 5, useful: 3}, und ein neuer Benutzer votes useful sollte es usefulness: { usefulResult:-1 , notUseful: 5, useful: 4} sein, wenn er dann seine Meinung ändert und notUseful das Objekt sollte usefulness: { usefulResult:-3 , notUseful: 6, useful: 3} ändern.

Ich arbeite mit Mungo und und Express. Ich habe eine Menge Zeug probiert. Hier sind einige Dinge, mit denen ich arbeite. Für dich ergibt das vielleicht keinen Sinn. Ich weiß nicht, was mit mir los ist. Einige Sachen am Anfang sind für andere Funktionalität. Einige der Sachen, die ich vorher ausprobiert habe, sind Kommentare.

Reviews.findOne({companyName: comp , user : userId}).populate({ 
     path : "user", 
     model : "Anon" 
    }) 
    .then(function(returnedReview){ 
     console.log("returnedReview", returnedReview) 
     // var returnedModel = new Reviews 
     // returnedReview.usefulness = {} 
     var mapped = returnedReview.userWhoVoted.toObject().map(function(e) {return e.userWhoVotedId.toString()}) 
     if(mapped.indexOf(app.locals.user._id.toString()) == -1){ 
      console.log("typeof app.locals.user.id---", typeof app.locals.user._id.toString()) 
      mapped.push(app.locals.user._id.toString()) 
     } 
     var index = mapped.indexOf(app.locals.user._id.toString()) 
     console.log("--------INDEX----------", index) 
     console.log("mapped User that voted?? --" , mapped) 
     var checkForuserWhoVotedId= returnedReview.userWhoVoted.toObject().some(function(el){ 
      return el.userWhoVotedId.toString() == app.locals.user._id.toString() 
     }) 
     var checkForWordUseful = returnedReview.userWhoVoted.toObject().some(function(el){ 
      return el.result == "useful" && el.userWhoVotedId.toString() == app.locals.user._id; 
     }) 
     var checkForWordNotUsefull = returnedReview.userWhoVoted.toObject().some(function(el){ 
      return el.result == "notUseful" && el.userWhoVotedId.toString() == app.locals.user._id; 
     }) 

     var userWhoVoted = returnedReview.userWhoVoted; 
     var usefulnessObj = returnedReview.usefulness; 

     if(userWhoVoted.toObject().length == 0){ 
      userWhoVoted.push({userWhoVotedId : app.locals.user._id.toString(), result : result}) 
     }else if(userWhoVoted.toObject().length > 0 && !checkForuserWhoVotedId) { 

      userWhoVoted.push({userWhoVotedId : app.locals.user._id, result : result}) 
     }else if(userWhoVoted.toObject().length > 0 && checkForuserWhoVotedId && result == "notUseful" && checkForWordUseful){ 
      if(userWhoVoted[index].result){ 
       var indexed = userWhoVoted[index].result 
      } 


      userWhoVoted[index].result = "notUseful" 
     }else if(userWhoVoted.toObject().length > 0 && checkForuserWhoVotedId && result == "useful" && checkForWordNotUsefull){ 
      if(userWhoVoted[index].result){ 
       var indexed = userWhoVoted[index].result 
      } 
      userWhoVoted[index].result = "useful" 
     } 

     if(!checkForuserWhoVotedId){ 
       if(result == "useful") usefulnessObj.useful++ 
       if(result == "notUseful") usefulnessObj.notUseful++ 
       userWhoVoted[index].nowUseful = usefulnessObj.useful; 
       userWhoVoted[index].nowNotUseful = usefulnessObj.notUseful; 
       console.log("usefulnessObj.useful : ",usefulnessObj.useful, "userWhoVoted[index].nowUseful + 1 : ", userWhoVoted[index].nowUseful + 1) 
     }else if(checkForuserWhoVotedId){ 
      // console.log("usefulnessObj.useful : ",usefulnessObj.useful, "userWhoVoted[index].nowUseful + 1 : ", userWhoVoted[index].nowUseful + 1) 
      if(result == "useful" && usefulnessObj.useful + 1 <= userWhoVoted[index].nowUseful){ 
       usefulnessObj.useful++ 
       // usefulnessObj.notUseful-- 
      } 
      if(result == "notUseful" && usefulnessObj.notUseful + 1 <= userWhoVoted[index].nowNotUseful){ 
       usefulnessObj.notUseful++ 
       // usefulnessObj.useful-- 
      } 
      // if(result == "useful" && usefulnessObj.useful > userWhoVoted[index].nowUseful - 1){ 

      // } 
     } 

     // var upperBoundUseful = 
     // console.log("userWhoVoted[index].result ", indexed, " result: ", result) 
     // if(indexed !== result){ 
     //  if(userWhoVoted[index].result =="useful"){ 
     //   returnedReview.usefulness.useful++ 
     //   returnedReview.usefulness.notUseful-- 
     //  }else if(userWhoVoted[index].result =="notUseful"){ 
     //   returnedReview.usefulness.notUseful++ 
     //   returnedReview.usefulness.useful-- 
     //  } 

     // } 
     // if(indexed !== userWhoVoted[index].result) 




    // if(result == "useful") returnedReview.usefulness.useful++ 
    // if(result == "notUseful") returnedReview.usefulness.notUseful++ 
     returnedReview.usefulness.usefulResult = returnedReview.usefulness.useful - Math.abs(returnedReview.usefulness.notUseful); 
    // userWhoVoted = [] 
     returnedReview.save(function(err, doc){ 
      if(err) throw err; 
      if(doc) console.log("doc", doc) 
      res.send(doc.usefulness) 
      // res.end() 
     }) 

    }) 
    .catch(function(err){ 
     console.log(err) 
    }) 
    // res.end() 
} 

Objekt zurückgegeben von save:

doc { _id: 57c760de1e08000300525775, 
    updatedAt: Wed Sep 07 2016 03:32:29 GMT-0400 (Eastern Daylight Time), 
    createdAt: Wed Aug 31 2016 18:57:34 GMT-0400 (Eastern Daylight Time), 
    vote: 'up', 
    reviewText: 'this sisisfrfr', 
    company: 57c4f982a82a799432999b63, 
    companyName: 'comp1', 
    userType: 'anon', 
    user: 
    { _id: 57c760cf1e08000300525774, 
    __v: 1, 
    usefulness: [], 
    reviews: [ 57c760de1e08000300525775 ] }, 
    __v: 2, 
    className: '', 
    createdString: 'We, August 31st 16, 6:57:34 pm', 
    momented: '6 days ago', 
    updatedString: 'We, September 7th 16, 3:32:23 am', 
    userWhoVoted: 
    [ { nowNotUseful: 0, 
     nowUseful: 1, 
     userWhoVotedId: 57cfc275e3ec2c3826ea55a0, 
     result: 'notUseful' } ], 
    usefulness: { usefulResult: 1, notUseful: 0, useful: 1 }, 
    statements: 
    [ { name: 'statement2', 
     question: 'This is the question for statement2', 
     result: 6 }, 
    { name: 'statement3', 
     question: 'This is the question for statement3', 
     result: 9 } ] } 

Es kam aus der Hand.

Antwort

1

In Ordnung, Ihr Problem ist also nur, dass der Benutzer eine Stimme hat, und Sie suchen nach einer guten Struktur dafür? Hier ist, was ich auf einer vereinfachten Kommentar Struktur tun würde:

https://jsfiddle.net/WilliamIPark/kuy0d1ec/5/

var review = { 
    author: '57c760cf1e08000300525774', 
    content:'Some content', 
    usefulness: { 
    useful: [ 
     '57c760cf1e08000300525774', 
     '57cfc275e3ec2c3826ea55a0' 
    ], 
    useless: [ 
     '57cfc275e308000300a55a7', 
     '57c4f982a82a799432999b63', 
     '57c4f982f82a799400a55a7' 
    ], 
    total: function() { 
      return this.useful.length - this.useless.length; 
    } 
    } 
} 

review.usefulness.total() wird die Berechnung ausspucken, und es wird genau so lange, wie Sie halten nur 1 Instanz des Benutzer-IDs in der "nützliche" und "nutzlose" Arrays.

Natürlich würden Sie dann haben ein paar Funktionen:

  • eine Benutzer-ID in das Objekt review.usefullness hinzufügen, entweder review.usefullness.useful oder review.usefullness.useless.

  • Prüfung für die ID bereits entweder bestehende Benutzer in review.usefullness.useful oder review.usefullness.useless, und fügen Sie, nichts tun, oder entfernen von review.usefullness.useful oder review.usefullness.useless je nach der Prüfung.

+0

Interessant. Auf diese Weise muss ich nicht inkrementieren (++). Fügen Sie einfach die IDs hinzu und entfernen Sie sie aus den Arrays, die ihre Längen für die Ergebnisse erhalten. Ich werde später daran arbeiten. Habe ich den Hauptpunkt Ihrer Antwort bekommen? Danke, dass du mir einen anderen Weg gezeigt hast, der hilfreich sein könnte. –

+0

Korrigieren. Solange Sie die IDs zu und von den 2 Arrays korrekt verwalten, um Duplikate zu vermeiden, wird dies funktionieren. –

+0

Wenn Sie den jsfiddle Code auschecken, habe ich eine Funktion hinzugefügt, um zu demonstrieren, dass Sie mit den richtigen Überprüfungen abstimmen. –

Verwandte Themen