Nyckeln till att lösa detta är att förstå att direkt Mongoid
metoder när din Rails 3-applikations session_store
är inställd på mongoid_store
skulle aldrig tillåta den här typen av direkt databasinteraktion.
Så istället, genom att använda Mongoid bara för den grundläggande databasanslutningen men sedan faktiskt interagera med mopeden
kärnan i Mongoid direkt på förardriftsnivå, samma funktionalitet kan uppnås med lätthet! Här är Mongoid/Moped rake
uppgift jag kom på som fungerar ganska bra:
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
Anslutningen ställs in via db = Mongoid::Sessions.default
och magin händer i raden:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Jag har ställt in ett stale_window
variabel så att jag enkelt kan justera intervallet för denna uppgift; anger DB-värdet samt beskrivningen. För att använda det kör jag det så här från kodbassökvägen:
RAILS_ENV=production bundle exec rake sessions:cleanup
Och naturligtvis ändra bara RAILS_ENV
värde för att matcha miljön du vill att denna uppgift ska agera på; såsom staging
, development
eller vad du nu kan kalla din miljö. Efter att ha kört den rake
uppgift, sessions
samlingstabellen beskärs till något mer realistiskt med verklig användning och den övergripande databasstorleken är mer rimlig att hantera.