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ší.