2011-08-29 12 views
5

Obecnie próbuję zaimplementować dziennik dla sekcji administracyjnej aplikacji mojej szyny. Umożliwi to administratorowi zobaczenie, jakie akcje wykonał użytkownik i kiedy. Np. "Użytkownik dodał nowy adres", "Użytkownik zaktualizował swój kod pocztowy z X na Y".Zachowaj dziennik zdarzeń użytkownika w szynach

Ponieważ każde działanie może potencjalnie obejmować wiele modeli, nie tylko użytkownika, stworzyłem model dziennika, który zawiera pola dla wszystkich pozostałych identyfikatorów modeli systemowych, wiadomości i kodu logu.

class CreateLogs < ActiveRecord::Migration 
    def self.up 
    create_table :logs do |t| 
     t.integer :user_id 
     t.integer :marker_id 
     t.integer :administrator_id 
     t.integer :group_id 
     t.integer :assignment_id 
     t.integer :submission_id 
     t.integer :code 
     t.text :message 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :logs 
    end 
end 

Moim problemem jest to, że na przykład, użytkownik może (powiedzmy) dodać zadanie do swojego konta, to zostanie zarejestrowane jako

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '') 

(Gdzieś kod 342 odpowiada „Użytkownik utworzony nowy adres ", więc nie ma potrzeby przesyłania wiadomości)

Oczywiście w widoku dziennika mogę wyciągnąć odpowiednie informacje o użytkowniku i adresie z logów ids/details, ale jeśli ten użytkownik lub adres miał zostać usunięty, wszystkie te informacje być niedostępne i tak przeglądając logi, wpis byłby podstawowy y bezużyteczny.

Musi istnieć lepszy sposób lub coś, co pomoże już rejestrować takie zdarzenia systemowe i poradzić sobie z ewentualnymi usunięciami.

Ewentualnie mogę zapisać cały wpis jako wiadomość tekstową, ale czy nie byłoby to naprawdę złe i niepotrzebnie zapełniać bazę danych?

Daj mi znać, jeśli coś z tego jest niejasne, po prostu wymyślone działania/zdarzenia aplikacji do logowania musiały zostać wykonane wcześniej!

Dzięki,

Pete

Odpowiedz

3

Spójrz na klejnotów notowanych na ActiveRecord Versioning, to chyba to, czego potrzebujesz.

+0

To wygląda obiecująco, szczególnie jak ślad papieru, ale może zapisać tylko jedną wersję/log, gdy model zostanie zmieniony, prawda? Co zrobić, jeśli chcę ręcznie określić każdą zmianę osobno? Lub jeśli jest wykonana czynność, która niekoniecznie zmienia model, ale robi coś innego, jak wysłanie e-maila? –

+0

Tak, wersja/audyt jest zwykle wyzwalana tylko przez zmiany w rekordach. Jeśli chcesz rejestrować akcje niestandardowe, które niekoniecznie powodują zmianę bazy danych, musisz utworzyć własny program rejestrujący. – eugen

1

Myślę, że trafiłeś na dobre rozwiązanie, używając surowego tekstu zamiast (lub oprócz) identyfikatorów. Jeśli przechowujesz nazwy użytkowników i adresy, prawdopodobnie nie złamie to żadnej pojemności. W ten sposób działa plik logu; wypluwa, kto zrobił co i kiedy to się stało. Nie sądzę, aby w ogóle utrudniło to twojemu serwerowi przechowywanie dodatkowych danych w tekście. Jeśli jednak stanie się ogromny, zawsze możesz zachować dzienniki z ostatnich kilku tygodni. Może mieć jakieś zadanie, które czyści wszystkie pliki dziennika, które są starsze niż 4 tygodnie. Ale zależy to w dużej mierze od poziomu logowania użytkownika: jeśli rejestrujesz każdą czynność, jaką robi użytkownik, to robi się naprawdę duża. Jeśli interesują Cię tylko kluczowe wydarzenia (użytkownik zalogowany/wylogowany, utworzony/zaktualizowany/usunięty, itp.), To myślę, że dobrze jest przechowywać tekst i czyścić co jakiś czas.

Powiązane problemy