A chave para resolver isso é entender que usar o Mongoid direto métodos quando o
session_store
do seu aplicativo Rails 3 está definido como mongoid_store
nunca permitiria que esse tipo de interação direta com o banco de dados acontecesse. Então, em vez disso, usando o Mongoid apenas para a conexão básica do banco de dados, mas na verdade interagindo com o Moped núcleo do Mongoid diretamente no nível de operação do driver, a mesma funcionalidade pode ser alcançada com facilidade! Aqui está o Mongoid/Moped
rake
tarefa que criei que funciona muito bem: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
A conexão é definida via
db = Mongoid::Sessions.default
e a mágica acontece na linha:db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Eu configurei uma
stale_window
variável para que eu possa ajustar facilmente o alcance desta tarefa; define o valor DB, bem como a descrição. Para usá-lo, eu o executo assim a partir do caminho da base de código:RAILS_ENV=production bundle exec rake sessions:cleanup
E, claro, basta alterar o
RAILS_ENV
valor para corresponder ao ambiente em que você deseja que essa tarefa atue; como staging
, development
ou qualquer outro nome que você possa nomear seu ambiente. Depois de executar esse rake
tarefa, as sessions
A tabela de coleta é reduzida para algo mais realista com o uso no mundo real e o tamanho geral do banco de dados é mais razoável para lidar.