Der Schlüssel zur Lösung dieses Problems liegt darin, zu verstehen, dass die direkte Verwendung von Mongoid
Methoden, wenn der session_store
Ihrer Rails 3-Anwendung auf mongoid_store
eingestellt ist würde diese Art von direkter Datenbankinteraktion niemals zulassen.
Also stattdessen, indem Sie Mongoid nur für die grundlegende Datenbankverbindung verwenden, aber dann tatsächlich mit dem Moped
interagieren Kern von Mongoid direkt auf einer Treiberbetriebsebene, die gleiche Funktionalität kann mit Leichtigkeit erreicht werden! Hier ist der Mongoid/Moped rake
Aufgabe, die ich mir ausgedacht habe und die ganz gut funktioniert:
namespace :sessions do
stale_window = 7
desc "Clear stale DB sessions older than #{ stale_window } days."
task :cleanup => :environment do
db = Mongoid::Sessions.default
begin
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
rescue Moped::Errors::SocketError => e
# Rescue here if needed. If not, the screwed up process dies silently.
end
end
end
Die Verbindung wird über db = Mongoid::Sessions.default
eingestellt und die Magie passiert in der Zeile:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Ich habe ein stale_window
gesetzt variabel, damit ich den Bereich dieser Aufgabe leicht anpassen kann; setzt den DB-Wert sowie die Beschreibung. Um es zu verwenden, führe ich es wie folgt aus dem Codebasispfad aus:
RAILS_ENV=production bundle exec rake sessions:cleanup
Und natürlich einfach den RAILS_ENV
ändern Wert, der der Umgebung entspricht, in der Sie diese Aufgabe ausführen möchten; wie staging
, development
oder wie auch immer Sie Ihre Umgebung nennen könnten. Nachdem Sie diesen rake
ausgeführt haben Aufgabe, die sessions
Die Sammlungstabelle wird auf etwas realistischeres mit der realen Nutzung reduziert und die Gesamtgröße der Datenbank ist vernünftiger zu handhaben.