System punktowania użytkowników

Planując prosty serwis newsowy, jako jedną z funkcjonalności postanowiłem zrobić ocenę użytkowników. Przykładowa tableka punktowania ma wyglądać tak:

1. Rejestracja: +5 2. Wysłanie artykułu: +10 3. Artykuł wyświetlony na pierwszej stronie: +5 4. Oznaczenie artykułu jako spam: +3 5. Napisanie komentarza: +1 6. Twój komentarz oznaczono jako obraźliwy/flame/spam itp: -5 7. Błędne oznaczenie komentarza jako spam: -1 8. Twój artykuł oznaczono jako spam: -20
Zastanawiam się jak to technicznie rozwiązać, pierwszym pomysłem jest stworzenie tabel comment_spam, post_spam (kolumny: post/comment_id, spam(bool, czy rzeczywiście zgłoszenie dobre), user_id). Następnie odpalałbym z crona (powiedzmy co 3h) task rake’a który przechodziłby po każdym użytkowniku, po każdym jego poście, komentarzu, spam_commentach i spam_postach itp i zliczał to wszystko do kolumny points w tabeli user. Zastanawiam się tylko jak łatwo uzyskać informację za co ma dany user punkty? Stworzyć dodatkową tabelę cache’ującą to wszystko? (jeśli tak to jak ma wyglądać, aby się łatwo i wygodnie obsługiwało? kolumny typu point_from (tu numer od 1-8, patrz tabela punktowania), post/comment/post_spam/comment_spam_id zdecydowanie mi się nie podobają ;))

Mam nadzieję, że wystarczająco jasno i klarownie przedstawiłem mój problem. Chciałbym podkreślić, że robię to głównie ze względów edukacyjnych i jeśli nawet istnieje gotowy plugin do tego to i tak pragnąłbym uzyskać odpowiedzi na dręczące mnie pytania :))

Hmm… Czy Twojego problemu nie można byłoby rozwiązać za pomocą klasy ActiveRecord::Observer? :wink:

http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

Wtedy user miałby tylko kolumnę ‘karma’, a komentarze i artykułu boolean ‘spam’.

Wygląda obiecująco. Dzięki, przyjrzę się bliżej.

Nie wystarczy bo kilku użytkowników może zgłosić dany post/komentarz jako spam (admini/moderatorzy nie działają 24h na dobę by na bieżąco sprawdzać) i jeśli mieliby rację to wszyscy powinni dostać punkty.

EDIT: I co z drugą cześcią? [quote=sebcioz]Zastanawiam się tylko jak łatwo uzyskać informację za co ma dany user punkty? Stworzyć dodatkową tabelę cache’ującą to wszystko? (jeśli tak to jak ma wyglądać, aby się łatwo i wygodnie obsługiwało? kolumny typu point_from (tu numer od 1-8, patrz tabela punktowania), post/comment/post_spam/comment_spam_id zdecydowanie mi się nie podobają )[/quote]

Ja bym zrobił klasę Rating, z user_id, item_id (news, komentarz), points, cokolwiek jeszcze. I po dodaniu takiego ratinga odpalić Delayed::Job która przelicza punkty dla danego użytkownika (rating.item.user).

Siedzę z gorączką, ma to sens?

[quote=grk]Ja bym zrobił klasę Rating, z user_id, item_id (news, komentarz), points, cokolwiek jeszcze. I po dodaniu takiego ratinga odpalić Delayed::Job która przelicza punkty dla danego użytkownika (rating.item.user).

Siedzę z gorączką, ma to sens?[/quote]
Tylko, że to nie rozwiązuje problemu podwójnego zliczania.

[quote=bober0][quote=grk]Ja bym zrobił klasę Rating, z user_id, item_id (news, komentarz), points, cokolwiek jeszcze. I po dodaniu takiego ratinga odpalić Delayed::Job która przelicza punkty dla danego użytkownika (rating.item.user).

Siedzę z gorączką, ma to sens?[/quote]
Tylko, że to nie rozwiązuje problemu podwójnego zliczania.[/quote]
Jakiego podwójnego zliczania?