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.