De sleutel om dit op te lossen is te begrijpen dat het gebruik van directe Mongoid
methoden wanneer de session_store
. van uw Rails 3-toepassing is ingesteld op mongoid_store
zou dit soort directe database-interactie nooit toestaan.
Dus in plaats daarvan, door Mongoid alleen te gebruiken voor de basisdatabaseverbinding, maar dan daadwerkelijk te communiceren met de bromfiets
kern van Mongoid direct op het bedieningsniveau van de bestuurder, dezelfde functionaliteit kan gemakkelijk worden bereikt! Hier is de mongoïde/bromfiets rake
taak die ik heb bedacht en die redelijk goed werkt:
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
De verbinding wordt ingesteld via db = Mongoid::Sessions.default
en de magie gebeurt in de regel:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Ik heb een stale_window
ingesteld variabel zodat ik het bereik van deze taak gemakkelijk kan aanpassen; stelt zowel de DB-waarde als de beschrijving in. Om het te gebruiken, voer ik het als volgt uit vanaf het codebase-pad:
RAILS_ENV=production bundle exec rake sessions:cleanup
En natuurlijk verander gewoon de RAILS_ENV
waarde die past bij de omgeving waarin u wilt dat deze taak werkt; zoals staging
, development
of hoe je je omgeving ook maar wilt noemen. Na het uitvoeren van die rake
taak, de sessions
verzamelingstabel wordt gesnoeid tot iets realistischer met gebruik in de echte wereld en de totale databasegrootte is redelijker om mee om te gaan.