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 :))
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).
[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?