Kluczem do rozwiązania tego problemu jest zrozumienie, że użycie bezpośredniego Mongoid
metody, gdy session_store
Twojej aplikacji Rails 3 jest ustawiony na mongoid_store
nigdy nie pozwoliłaby na taką bezpośrednią interakcję z bazą danych.
Zamiast tego, używając Mongoid tylko do podstawowego połączenia z bazą danych, ale następnie wchodząc w interakcję z Mopedem
rdzeń Mongoid bezpośrednio na poziomie obsługi sterownika, tę samą funkcjonalność można osiągnąć z łatwością! Oto Mongoid/Moped rake
zadanie, które wymyśliłem, działa całkiem dobrze:
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
Połączenie jest ustawiane przez db = Mongoid::Sessions.default
i magia dzieje się w linii:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Ustawiłem stale_window
zmienna, dzięki czemu mogę łatwo dostosować zakres tego zadania; ustawia wartość DB oraz opis. Aby go użyć, uruchamiam go w ten sposób ze ścieżki bazy kodu:
RAILS_ENV=production bundle exec rake sessions:cleanup
I oczywiście po prostu zmień RAILS_ENV
wartość dopasowana do środowiska, w którym ma działać to zadanie; takie jak staging
, development
lub jakkolwiek inaczej nazwiesz swoje środowisko. Po uruchomieniu tego rake
zadanie, sessions
tabela kolekcji zostaje przycięta do czegoś bardziej realistycznego w rzeczywistych zastosowaniach, a ogólny rozmiar bazy danych jest bardziej rozsądny.