2016-05-04 3 views
0

Ich versuche, ein Reputationssystem in eine vorhandene App mit Merit hinzuzufügen.Wie 'Merit Points' zurückgerechnet werden?

Ich möchte Punkte für alle Benutzer basierend auf ihrer historischen Aktivität zurück berechnen. Merit hat eine ziemlich komplizierte interne Struktur mit mehreren Tabellen, und ich denke, dass mir einige wichtige Schritte fehlen. Unten ist, was ich bisher habe, und ich bin dankbar für Hinweise von jedem, der mit diesem Juwel vertrauter ist.

Um die Dinge einfach zu halten, lassen Sie uns sagen, dass ich zu

score 2, to: :user, on: 'comments#create' 

wollen und dass ich einen Kommentar Tabelle von Datensätzen voll haben, die so etwas wie dies wie folgt

Comment id: 56, content: "My comment", user_id: 247, commentable_id: 2, commentable_type: 'Object', created_at: "2016-04-04 08:56:17", updated_at: "2016-04-04 17:03:55"> 

Mein aktueller Ansatz

aussehen sieht
Comment.all.each do |c| 
    score_point = Merit::Score::Point.create(num_point: 2, log: nil, created_at: c.created_at) 
    action = Merit::Action.create(user_id: c.user_id, action_method: 'create', action_value: nil, had_errors: false, target_model: c.class.name, target_id: c.id, processed: true, created_at: c.created_at) 
    activity_log = Merit::ActivityLog.create(action_id: action.id, related_change_type: "Merit::Score::Point", related_change_id: score_point.id, description: "", created_at: c.created_at) 
end 

Es gibt auch eine Merit::Score und Merit::Sash Tabelle, aber ich bin nicht klar, was diese tun und ob diese Datensätze müssen auch erstellt werden.

Gibt es noch etwas, das ich übersehen habe?

Wie nebenbei, was ist der Zweck von Merit::Action.action_value, Merit::ActivityLog.description und Merit::Score::Point.log, oder sind das einfach freie Textfolgen?

Antwort

1

Merit hat die Fähigkeit, Reputation für jeden Benutzer von seiner Merit::Action neu zu berechnen. In this StackOverflow answer können Sie sehen, wie eine bestehende Anwendung Verdienst könnte:

  1. Löschen Sie alle Protokolle, Abzeichen und verweist auf einen Benutzer
  2. Zusammenhang gewährt
  3. Mark alle Aktionen wie processed: false
  4. Recompute die nun nicht verarbeitete Regeln

In Ihrem speziellen Fall, die einzige Verdienstmodell Sie ist erstellen möchten würde action, und es als processed: false statt true initialisiert. Merit::Action.check_unprocessed sollte dann die Reputation wiederherstellen, die Sie suchen.

This wiki article, die erläutert, Merit Internals könnte Ihnen helfen, die Logik hinter diesen Schritten zu verstehen.


Merit::Action.action_value, Merit::ActivityLog.description und Merit::Score::Point.log haben kein sinnvolles Verhalten im Verdienst, und Sie können sie verwenden, wenn nötig.

+0

danke @TuteC, ich hatte gesehen, dass SO vorher zu antworten, aber vielleicht die nachfolgenden Kommentare missverstanden haben. Danke fürs klarstellen!! –

+0

hi @ tuteC, welches Format sollte 'Merit :: Action.target_model' sein? Handelt es sich um eine plurale Repräsentation des Modells in Kleinbuchstaben (z. B. Kommentare)? Ich habe Probleme mit dieser Methode Punkte zu generieren. Running 'Merit :: Action.check_unprocessed' ist korrekt zugewiesen Abzeichen und Hinzufügen von Datensätzen zu' Merit :: Score', aber 'Merit :: Score :: Point' bleibt leer. Ich gehe davon aus, dass dies nicht das richtige Ergebnis ist, aber ich kann die Ursache nicht herausfinden. –

+0

macht mir nichts aus, ich musste die vorherigen Punktdefinitionen aus dem Speicher löschen 'Merit :: AppPointRules = Merit :: PointRules.new.defined_rules'. Alles funktioniert jetzt. Danke für ein tolles Juwel !! –

Verwandte Themen