PaperTrail Optimierung für Scraping-Operationen¶
Problem¶
Während der Turnier-Scraping-Operationen erstellte PaperTrail unnötige Versionsdatensätze, bei denen sich nur der updated_at
Zeitstempel oder das sync_date
Feld änderte, aber keine bedeutsamen Daten modifiziert wurden. Zusätzlich wurde data_will_change!
auch dann aufgerufen, wenn das data
Feld sich tatsächlich nicht geändert hatte, wodurch Versionsdatensätze für nicht existierende Änderungen erstellt wurden.
Beispiel des Problems:
# Versionsdatensatz zeigt nur Zeitstempel-Änderungen
{
"data" => [nil, nil],
"updated_at" => [2025-03-17 14:54:40.746295 UTC, 2025-06-27 12:00:32.087019 UTC]
}
Lösung¶
1. PaperTrail konfigurieren, um bestimmte Felder zu ignorieren (nur API-Server)¶
Hinzugefügt has_paper_trail ignore: [:updated_at, :sync_date] unless Carambus.config.carambus_api_url.present?
zu Modellen, die häufig während Scraping-Operationen aktualisiert werden. PaperTrail ist nur auf API-Servern aktiviert (wenn carambus_api_url
vorhanden ist), nicht auf lokalen Servern.
Modelle mit PaperTrail-Konfiguration:
- Tournament
- Ignoriert updated_at
und sync_date
- Game
- Ignoriert updated_at
- Party
- Ignoriert updated_at
und sync_date
- League
- Ignoriert updated_at
und sync_date
- Club
- Ignoriert updated_at
und sync_date
- Location
- Ignoriert updated_at
und sync_date
- Region
- Ignoriert updated_at
und sync_date
- SeasonParticipation
- Ignoriert updated_at
und sync_date
2. Unnötige data_will_change!
Aufrufe beheben¶
Behobene Methoden, die data_will_change!
aufriefen, auch wenn das data
Feld sich tatsächlich nicht geändert hatte:
Tournament Model:
- before_save
Callback: Verarbeitet Daten nur, wenn sie vorhanden sind
- deep_merge_data!
Methode: Ruft data_will_change!
nur auf, wenn sich Daten tatsächlich geändert haben
- reset_tournament
Methode: Ruft data_will_change!
nur auf, wenn Daten nicht bereits leer sind
Game Model:
- deep_merge_data!
Methode: Ruft data_will_change!
nur auf, wenn sich Daten tatsächlich geändert haben
- deep_delete!
Methode: Ruft data_will_change!
nur auf, wenn sich Daten tatsächlich geändert haben
3. Bereinigungsaufgabe¶
Erstellte Rake-Task, um bestehende unnötige Versionsdatensätze zu bereinigen:
rails cleanup:cleanup_paper_trail_versions
Diese Task:
- Identifiziert Versionsdatensätze, die nur updated_at
oder sync_date
Änderungen enthalten
- Entfernt sie aus der Datenbank
- Bietet eine Zusammenfassung der gelöschten Datensätze
4. Tests¶
Hinzugefügte Tests, um zu überprüfen, dass PaperTrail die angegebenen Felder korrekt ignoriert:
test "PaperTrail ignores updated_at and sync_date changes" do
# Test-Implementierung in test/models/tournament_test.rb
end
Vorteile¶
- Reduzierter Datenbankspeicher: Eliminiert unnötige Versionsdatensätze
- Saubere Versionshistorie: Nur bedeutsame Änderungen werden verfolgt
- Bessere Leistung: Weniger Datensätze, die während Versionsabfragen verarbeitet werden müssen
- Erhaltene Audit-Spur: Wichtige Änderungen werden weiterhin verfolgt
- Lokale Server-Optimierung: Kein PaperTrail-Overhead auf lokalen Servern
- Genaue Änderungserkennung: Erstellt nur Versionen, wenn sich Daten tatsächlich geändert haben
Verwendung¶
Für neue Modelle¶
Beim Hinzufügen von PaperTrail zu einem neuen Modell, das während des Scrapings aktualisiert werden könnte:
class NewModel < ApplicationRecord
include LocalProtector
include SourceHandler
# PaperTrail konfigurieren, um automatische Zeitstempel-Updates zu ignorieren (nur API-Server)
has_paper_trail ignore: [:updated_at, :sync_date] unless Carambus.config.carambus_api_url.present?
end
Für bestehende Modelle¶
Wenn Sie Ignore-Konfiguration zu einem bestehenden Modell hinzufügen müssen:
- Fügen Sie die Zeile
has_paper_trail ignore: [...] unless Carambus.config.carambus_api_url.present?
zum Modell hinzu - Überprüfen und beheben Sie alle
data_will_change!
Aufrufe, damit sie nur ausgelöst werden, wenn sich Daten tatsächlich geändert haben - Führen Sie die Bereinigungsaufgabe aus, um bestehende unnötige Versionen zu entfernen
- Testen Sie, um sicherzustellen, dass wichtige Änderungen weiterhin verfolgt werden
Implementierungsdetails¶
Konfiguration¶
# In config/application.rb oder initializers
Carambus.configure do |config|
config.carambus_api_url = ENV['CARAMBUS_API_URL']
end
Modell-Integration¶
class Tournament < ApplicationRecord
include LocalProtector
include SourceHandler
# PaperTrail nur auf API-Servern aktivieren
has_paper_trail ignore: [:updated_at, :sync_date] unless Carambus.config.carambus_api_url.present?
# Weitere Modell-Logik...
end
Bereinigungsaufgabe¶
# lib/tasks/cleanup.rake
namespace :cleanup do
desc "Bereinigt unnötige PaperTrail-Versionsdatensätze"
task cleanup_paper_trail_versions: :environment do
# Implementierung der Bereinigungslogik
puts "Bereinigung abgeschlossen"
end
end
Monitoring und Wartung¶
Regelmäßige Überprüfung¶
- Wöchentlich: Überprüfen Sie die Anzahl der erstellten Versionsdatensätze
- Monatlich: Führen Sie die Bereinigungsaufgabe aus
- Quartalsweise: Überprüfen Sie die PaperTrail-Konfiguration aller Modelle
Performance-Metriken¶
- Versionsdatensätze pro Tag: Sollte nach der Optimierung deutlich sinken
- Datenbankgröße: Überwachen Sie das Wachstum der Versions-Tabellen
- Abfrageleistung: Testen Sie die Leistung von Versionsabfragen
Fehlerbehebung¶
Häufige Probleme¶
- PaperTrail funktioniert nicht: Überprüfen Sie, ob
carambus_api_url
korrekt gesetzt ist - Zu viele Versionen: Führen Sie die Bereinigungsaufgabe aus
- Fehlende Änderungen: Überprüfen Sie die Ignore-Konfiguration
Debugging¶
# Debug-Informationen aktivieren
Rails.logger.level = Logger::DEBUG
# PaperTrail-Status überprüfen
puts "PaperTrail aktiv: #{Tournament.paper_trail_enabled_for_model?}"
puts "Ignorierte Felder: #{Tournament.paper_trail_options[:ignore]}"