Chìa khóa để giải quyết vấn đề này là hiểu rằng sử dụng trực tiếp Mongoid
các phương thức khi session_store
của ứng dụng Rails 3 của bạn được đặt thành mongoid_store
sẽ không bao giờ cho phép loại tương tác cơ sở dữ liệu trực tiếp này xảy ra.
Vì vậy, thay vào đó, bằng cách sử dụng Mongoid chỉ cho kết nối cơ sở dữ liệu cơ bản nhưng sau đó thực sự tương tác với Moped
cốt lõi của Mongoid trực tiếp trên cấp độ hoạt động của trình điều khiển, chức năng tương tự có thể đạt được một cách dễ dàng! Đây là rake của Mongoid / Moped rake
nhiệm vụ tôi nghĩ ra hoạt động khá tốt:
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
Kết nối được đặt qua db = Mongoid::Sessions.default
và điều kỳ diệu xảy ra trong dòng:
db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
Tôi đã đặt một stale_window
biến để tôi có thể dễ dàng điều chỉnh phạm vi của nhiệm vụ này; đặt giá trị DB cũng như mô tả. Để sử dụng nó, tôi chạy nó như thế này từ đường dẫn codebase:
RAILS_ENV=production bundle exec rake sessions:cleanup
Và tất nhiên chỉ cần thay đổi RAILS_ENV
giá trị để phù hợp với môi trường mà bạn muốn nhiệm vụ này thực hiện; chẳng hạn như staging
, development
hoặc bất cứ điều gì khác mà bạn có thể đặt tên cho môi trường của mình. Sau khi chạy rake
đó nhiệm vụ, sessions
bảng bộ sưu tập được cắt tỉa thành một thứ gì đó thực tế hơn với cách sử dụng trong thế giới thực và kích thước cơ sở dữ liệu tổng thể hợp lý hơn để xử lý.