Nøglen til at løse dette er at forstå, at brug af direkte Mongoid
metoder, når din Rails 3-applikations session_store
er indstillet til mongoid_store
ville aldrig tillade denne form for direkte databaseinteraktion at ske.
Så i stedet, ved kun at bruge Mongoid til den grundlæggende databaseforbindelse, men så faktisk interagere med knallert
kerne af Mongoid direkte på et driverdriftsniveau, kan den samme funktionalitet opnås med lethed! Her er Mongoid/knallert rake
opgave jeg kom på, der fungerer ret godt:
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
Forbindelsen indstilles via db = Mongoid::Sessions.default
og magien sker i linjen:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Jeg har indstillet et stale_window
variabel, så jeg nemt kan justere rækkevidden af denne opgave; angiver DB-værdien samt beskrivelsen. For at bruge det kører jeg det sådan her fra kodebasestien:
RAILS_ENV=production bundle exec rake sessions:cleanup
Og selvfølgelig skal du bare ændre RAILS_ENV
værdi for at matche det miljø, du ønsker, at denne opgave skal handle på; såsom staging
, development
eller hvad du ellers kunne kalde dit miljø. Efter at have kørt den rake
opgave, sessions
samlingstabellen bliver beskåret til noget mere realistisk med brug i den virkelige verden, og den samlede databasestørrelse er mere rimelig at håndtere.