Zum Inhalt

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

  1. Reduzierter Datenbankspeicher: Eliminiert unnötige Versionsdatensätze
  2. Saubere Versionshistorie: Nur bedeutsame Änderungen werden verfolgt
  3. Bessere Leistung: Weniger Datensätze, die während Versionsabfragen verarbeitet werden müssen
  4. Erhaltene Audit-Spur: Wichtige Änderungen werden weiterhin verfolgt
  5. Lokale Server-Optimierung: Kein PaperTrail-Overhead auf lokalen Servern
  6. 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:

  1. Fügen Sie die Zeile has_paper_trail ignore: [...] unless Carambus.config.carambus_api_url.present? zum Modell hinzu
  2. Überprüfen und beheben Sie alle data_will_change! Aufrufe, damit sie nur ausgelöst werden, wenn sich Daten tatsächlich geändert haben
  3. Führen Sie die Bereinigungsaufgabe aus, um bestehende unnötige Versionen zu entfernen
  4. 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

  1. PaperTrail funktioniert nicht: Überprüfen Sie, ob carambus_api_url korrekt gesetzt ist
  2. Zu viele Versionen: Führen Sie die Bereinigungsaufgabe aus
  3. 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]}"