Klíčem k vyřešení tohoto problému je pochopení, že použití přímého Mongoid
při session_store
vaší aplikace Rails 3 je nastaven na mongoid_store
by nikdy nedovolil tento druh přímé interakce s databází.
Takže místo toho pomocí Mongoid jen pro základní připojení k databázi, ale pak ve skutečnosti interagovat s Moped
jádro Mongoidu přímo na úrovni ovládání ovladače, stejné funkčnosti lze snadno dosáhnout! Zde je mongoid/moped rake
úkol, se kterým jsem přišel a který funguje docela dobře:
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
Připojení se nastavuje pomocí db = Mongoid::Sessions.default
a kouzlo se odehrává v řádku:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Nastavil jsem stale_window
variabilní, takže mohu snadno upravit rozsah tohoto úkolu; nastavuje hodnotu DB i popis. Abych to mohl použít, spustím to takto z cesty codebase:
RAILS_ENV=production bundle exec rake sessions:cleanup
A samozřejmě stačí změnit RAILS_ENV
hodnota, která odpovídá prostředí, ve kterém chcete, aby tento úkol působil; jako je staging
, development
nebo jakkoli jinak byste mohli pojmenovat své prostředí. Po spuštění tohoto rake
úkol, sessions
Kolekce tabulka se ořezává na něco realističtějšího s použitím v reálném světě a celková velikost databáze je rozumnější.