Kunci untuk menyelesaikan ini adalah memahami bahwa menggunakan Mongoid
langsung metode ketika session_store aplikasi Rails 3 Anda diatur ke mongoid_store tidak akan pernah membiarkan interaksi database langsung seperti ini terjadi.
Jadi sebagai gantinya, dengan menggunakan Mongoid hanya untuk koneksi basis data dasar tetapi kemudian benar-benar berinteraksi dengan Moped
inti dari Mongoid langsung pada tingkat operasi driver, fungsi yang sama dapat dicapai dengan mudah! Ini rake Mongoid/Moped tugas yang saya buat yang bekerja dengan cukup baik:
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
Koneksi diatur melalui db = Mongoid::Sessions.default dan keajaiban terjadi di garis:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Saya telah menetapkan stale_window variabel sehingga saya dapat dengan mudah menyesuaikan rentang tugas ini; menetapkan nilai DB serta deskripsi. Untuk menggunakannya saya menjalankannya seperti ini dari jalur basis kode:
RAILS_ENV=production bundle exec rake sessions:cleanup
Dan tentu saja cukup ubah RAILS_ENV nilai agar sesuai dengan lingkungan yang Anda inginkan untuk ditindaklanjuti oleh tugas ini; seperti staging , development atau apa pun yang mungkin Anda beri nama lingkungan Anda. Setelah menjalankan rake tugas, sessions tabel koleksi dipangkas menjadi sesuatu yang lebih realistis dengan penggunaan dunia nyata dan ukuran database keseluruhan lebih masuk akal untuk ditangani.